|
@@ -2238,11 +2238,11 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G
|
|
if (!p_material->shader->spatial.uses_alpha_scissor && !p_material->shader->spatial.writes_modelview_or_projection && !p_material->shader->spatial.uses_vertex && !p_material->shader->spatial.uses_discard && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) {
|
|
if (!p_material->shader->spatial.uses_alpha_scissor && !p_material->shader->spatial.writes_modelview_or_projection && !p_material->shader->spatial.uses_vertex && !p_material->shader->spatial.uses_discard && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) {
|
|
//shader does not use discard and does not write a vertex position, use generic material
|
|
//shader does not use discard and does not write a vertex position, use generic material
|
|
if (p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) {
|
|
if (p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) {
|
|
- p_material = storage->material_owner.getptr(default_material_twosided);
|
|
|
|
|
|
+ p_material = storage->material_owner.getptr( p_material->shader->spatial.uses_world_coordinates ? default_worldcoord_material_twosided : default_material_twosided);
|
|
no_cull = true;
|
|
no_cull = true;
|
|
mirror = false;
|
|
mirror = false;
|
|
} else {
|
|
} else {
|
|
- p_material = storage->material_owner.getptr(default_material);
|
|
|
|
|
|
+ p_material = storage->material_owner.getptr( p_material->shader->spatial.uses_world_coordinates ? default_worldcoord_material : default_material);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2280,15 +2280,19 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G
|
|
}
|
|
}
|
|
|
|
|
|
e->sort_key |= uint64_t(e->material->index) << RenderList::SORT_KEY_MATERIAL_INDEX_SHIFT;
|
|
e->sort_key |= uint64_t(e->material->index) << RenderList::SORT_KEY_MATERIAL_INDEX_SHIFT;
|
|
- e->sort_key |= uint64_t(e->instance->depth_layer) << RenderList::SORT_KEY_OPAQUE_DEPTH_LAYER_SHIFT;
|
|
|
|
|
|
|
|
if (e->instance->gi_probe_instances.size()) {
|
|
if (e->instance->gi_probe_instances.size()) {
|
|
e->sort_key |= SORT_KEY_GI_PROBES_FLAG;
|
|
e->sort_key |= SORT_KEY_GI_PROBES_FLAG;
|
|
}
|
|
}
|
|
|
|
|
|
e->sort_key |= uint64_t(p_material->render_priority + 128) << RenderList::SORT_KEY_PRIORITY_SHIFT;
|
|
e->sort_key |= uint64_t(p_material->render_priority + 128) << RenderList::SORT_KEY_PRIORITY_SHIFT;
|
|
|
|
+ } else {
|
|
|
|
+ e->sort_key |= uint64_t(e->instance->depth_layer) << RenderList::SORT_KEY_OPAQUE_DEPTH_LAYER_SHIFT;
|
|
|
|
+ e->sort_key |= uint64_t(e->material->index) << RenderList::SORT_KEY_MATERIAL_INDEX_SHIFT;
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
if (e->geometry->type==RasterizerStorageGLES3::Geometry::GEOMETRY_MULTISURFACE)
|
|
if (e->geometry->type==RasterizerStorageGLES3::Geometry::GEOMETRY_MULTISURFACE)
|
|
e->sort_flags|=RenderList::SORT_FLAG_INSTANCING;
|
|
e->sort_flags|=RenderList::SORT_FLAG_INSTANCING;
|
|
@@ -4056,7 +4060,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
render_list.clear();
|
|
render_list.clear();
|
|
_fill_render_list(p_cull_result, p_cull_count, true);
|
|
_fill_render_list(p_cull_result, p_cull_count, true);
|
|
- render_list.sort_by_depth(false);
|
|
|
|
|
|
+ render_list.sort_by_key(false);
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, true);
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, true);
|
|
_render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, 0, false, false, true, false, false);
|
|
_render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, 0, false, false, true, false, false);
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, false);
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, false);
|
|
@@ -4086,10 +4090,10 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
_setup_lights(p_light_cull_result, p_light_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_shadow_atlas);
|
|
_setup_lights(p_light_cull_result, p_light_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_shadow_atlas);
|
|
_setup_reflections(p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_reflection_atlas, env);
|
|
_setup_reflections(p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_reflection_atlas, env);
|
|
|
|
|
|
- render_list.clear();
|
|
|
|
|
|
|
|
bool use_mrt = false;
|
|
bool use_mrt = false;
|
|
|
|
|
|
|
|
+ render_list.clear();
|
|
_fill_render_list(p_cull_result, p_cull_count, false);
|
|
_fill_render_list(p_cull_result, p_cull_count, false);
|
|
//
|
|
//
|
|
|
|
|
|
@@ -4760,6 +4764,19 @@ void RasterizerSceneGLES3::initialize() {
|
|
default_material_twosided = storage->material_create();
|
|
default_material_twosided = storage->material_create();
|
|
storage->shader_set_code(default_shader_twosided, "shader_type spatial; render_mode cull_disabled;\n");
|
|
storage->shader_set_code(default_shader_twosided, "shader_type spatial; render_mode cull_disabled;\n");
|
|
storage->material_set_shader(default_material_twosided, default_shader_twosided);
|
|
storage->material_set_shader(default_material_twosided, default_shader_twosided);
|
|
|
|
+
|
|
|
|
+ //default for shaders using world coordinates (typical for triplanar)
|
|
|
|
+
|
|
|
|
+ default_worldcoord_shader = storage->shader_create();
|
|
|
|
+ storage->shader_set_code(default_worldcoord_shader, "shader_type spatial; render_mode world_vertex_coords;\n");
|
|
|
|
+ default_worldcoord_material = storage->material_create();
|
|
|
|
+ storage->material_set_shader(default_worldcoord_material, default_worldcoord_shader);
|
|
|
|
+
|
|
|
|
+ default_worldcoord_shader_twosided = storage->shader_create();
|
|
|
|
+ default_worldcoord_material_twosided = storage->material_create();
|
|
|
|
+ storage->shader_set_code(default_worldcoord_shader_twosided, "shader_type spatial; render_mode cull_disabled,world_vertex_coords;\n");
|
|
|
|
+ storage->material_set_shader(default_worldcoord_material_twosided, default_worldcoord_shader_twosided);
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
{
|