Merge pull request #70214 from Ansraer/speed-maybe
[4.x] Use depth prepass to increase opaque render performance
This commit is contained in:
commit
2e07477751
1 changed files with 10 additions and 1 deletions
|
@ -256,6 +256,7 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
||||||
depth_stencil_state.depth_compare_operator = RD::COMPARE_OP_LESS_OR_EQUAL;
|
depth_stencil_state.depth_compare_operator = RD::COMPARE_OP_LESS_OR_EQUAL;
|
||||||
depth_stencil_state.enable_depth_write = depth_draw != DEPTH_DRAW_DISABLED ? true : false;
|
depth_stencil_state.enable_depth_write = depth_draw != DEPTH_DRAW_DISABLED ? true : false;
|
||||||
}
|
}
|
||||||
|
bool depth_pre_pass_enabled = bool(GLOBAL_GET("rendering/driver/depth_prepass/enable"));
|
||||||
|
|
||||||
for (int i = 0; i < CULL_VARIANT_MAX; i++) {
|
for (int i = 0; i < CULL_VARIANT_MAX; i++) {
|
||||||
RD::PolygonCullMode cull_mode_rd_table[CULL_VARIANT_MAX][3] = {
|
RD::PolygonCullMode cull_mode_rd_table[CULL_VARIANT_MAX][3] = {
|
||||||
|
@ -307,8 +308,16 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
RD::PipelineColorBlendState blend_state;
|
|
||||||
RD::PipelineDepthStencilState depth_stencil = depth_stencil_state;
|
RD::PipelineDepthStencilState depth_stencil = depth_stencil_state;
|
||||||
|
if (depth_pre_pass_enabled && casts_shadows()) {
|
||||||
|
// We already have a depth from the depth pre-pass, there is no need to write it again.
|
||||||
|
// In addition we can use COMPARE_OP_EQUAL instead of COMPARE_OP_LESS_OR_EQUAL.
|
||||||
|
// This way we can use the early depth test to discard transparent fragments before the fragment shader even starts.
|
||||||
|
depth_stencil.depth_compare_operator = RD::COMPARE_OP_EQUAL;
|
||||||
|
depth_stencil.enable_depth_write = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
RD::PipelineColorBlendState blend_state;
|
||||||
RD::PipelineMultisampleState multisample_state;
|
RD::PipelineMultisampleState multisample_state;
|
||||||
|
|
||||||
int shader_flags = 0;
|
int shader_flags = 0;
|
||||||
|
|
Loading…
Reference in a new issue