You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-12 13:20:55 +00:00
Fix depth pre-pass on all face cull modes
The default shadow material was used for depth rendering disregarding the cull mode of the original material. This commit adds a check so the default shadow material is only used when the original material has back-face culling.
This commit is contained in:
@@ -2662,7 +2662,7 @@ void RenderForwardClustered::_geometry_instance_add_surface_with_material(Geomet
|
|||||||
|
|
||||||
SceneShaderForwardClustered::MaterialData *material_shadow = nullptr;
|
SceneShaderForwardClustered::MaterialData *material_shadow = nullptr;
|
||||||
void *surface_shadow = nullptr;
|
void *surface_shadow = nullptr;
|
||||||
if (!p_material->shader_data->uses_particle_trails && !p_material->shader_data->writes_modelview_or_projection && !p_material->shader_data->uses_vertex && !p_material->shader_data->uses_position && !p_material->shader_data->uses_discard && !p_material->shader_data->uses_depth_pre_pass && !p_material->shader_data->uses_alpha_clip) {
|
if (!p_material->shader_data->uses_particle_trails && !p_material->shader_data->writes_modelview_or_projection && !p_material->shader_data->uses_vertex && !p_material->shader_data->uses_position && !p_material->shader_data->uses_discard && !p_material->shader_data->uses_depth_pre_pass && !p_material->shader_data->uses_alpha_clip && p_material->shader_data->cull_mode == SceneShaderForwardClustered::ShaderData::CULL_BACK) {
|
||||||
flags |= GeometryInstanceSurfaceDataCache::FLAG_USES_SHARED_SHADOW_MATERIAL;
|
flags |= GeometryInstanceSurfaceDataCache::FLAG_USES_SHARED_SHADOW_MATERIAL;
|
||||||
material_shadow = static_cast<SceneShaderForwardClustered::MaterialData *>(RendererRD::MaterialStorage::get_singleton()->material_get_data(scene_shader.default_material, RendererRD::SHADER_TYPE_3D));
|
material_shadow = static_cast<SceneShaderForwardClustered::MaterialData *>(RendererRD::MaterialStorage::get_singleton()->material_get_data(scene_shader.default_material, RendererRD::SHADER_TYPE_3D));
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
|||||||
int blend_mode = BLEND_MODE_MIX;
|
int blend_mode = BLEND_MODE_MIX;
|
||||||
int depth_testi = DEPTH_TEST_ENABLED;
|
int depth_testi = DEPTH_TEST_ENABLED;
|
||||||
int alpha_antialiasing_mode = ALPHA_ANTIALIASING_OFF;
|
int alpha_antialiasing_mode = ALPHA_ANTIALIASING_OFF;
|
||||||
int cull = CULL_BACK;
|
int cull_modei = CULL_BACK;
|
||||||
|
|
||||||
uses_point_size = false;
|
uses_point_size = false;
|
||||||
uses_alpha = false;
|
uses_alpha = false;
|
||||||
@@ -101,9 +101,9 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
|||||||
|
|
||||||
actions.render_mode_values["depth_test_disabled"] = Pair<int *, int>(&depth_testi, DEPTH_TEST_DISABLED);
|
actions.render_mode_values["depth_test_disabled"] = Pair<int *, int>(&depth_testi, DEPTH_TEST_DISABLED);
|
||||||
|
|
||||||
actions.render_mode_values["cull_disabled"] = Pair<int *, int>(&cull, CULL_DISABLED);
|
actions.render_mode_values["cull_disabled"] = Pair<int *, int>(&cull_modei, CULL_DISABLED);
|
||||||
actions.render_mode_values["cull_front"] = Pair<int *, int>(&cull, CULL_FRONT);
|
actions.render_mode_values["cull_front"] = Pair<int *, int>(&cull_modei, CULL_FRONT);
|
||||||
actions.render_mode_values["cull_back"] = Pair<int *, int>(&cull, CULL_BACK);
|
actions.render_mode_values["cull_back"] = Pair<int *, int>(&cull_modei, CULL_BACK);
|
||||||
|
|
||||||
actions.render_mode_flags["unshaded"] = &unshaded;
|
actions.render_mode_flags["unshaded"] = &unshaded;
|
||||||
actions.render_mode_flags["wireframe"] = &wireframe;
|
actions.render_mode_flags["wireframe"] = &wireframe;
|
||||||
@@ -145,6 +145,7 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
|||||||
|
|
||||||
depth_draw = DepthDraw(depth_drawi);
|
depth_draw = DepthDraw(depth_drawi);
|
||||||
depth_test = DepthTest(depth_testi);
|
depth_test = DepthTest(depth_testi);
|
||||||
|
cull_mode = Cull(cull_modei);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
print_line("**compiling shader:");
|
print_line("**compiling shader:");
|
||||||
@@ -258,7 +259,7 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
|||||||
{ RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_DISABLED }
|
{ RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_DISABLED }
|
||||||
};
|
};
|
||||||
|
|
||||||
RD::PolygonCullMode cull_mode_rd = cull_mode_rd_table[i][cull];
|
RD::PolygonCullMode cull_mode_rd = cull_mode_rd_table[i][cull_mode];
|
||||||
|
|
||||||
for (int j = 0; j < RS::PRIMITIVE_MAX; j++) {
|
for (int j = 0; j < RS::PRIMITIVE_MAX; j++) {
|
||||||
RD::RenderPrimitive primitive_rd_table[RS::PRIMITIVE_MAX] = {
|
RD::RenderPrimitive primitive_rd_table[RS::PRIMITIVE_MAX] = {
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ public:
|
|||||||
bool uses_time;
|
bool uses_time;
|
||||||
bool writes_modelview_or_projection;
|
bool writes_modelview_or_projection;
|
||||||
bool uses_world_coordinates;
|
bool uses_world_coordinates;
|
||||||
|
Cull cull_mode;
|
||||||
|
|
||||||
uint64_t last_pass = 0;
|
uint64_t last_pass = 0;
|
||||||
uint32_t index = 0;
|
uint32_t index = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user