diff options
author | Jonas Karlsson <jonas.karlsson@qt.io> | 2024-05-16 08:47:08 +0200 |
---|---|---|
committer | Jonas Karlsson <jonas.karlsson@qt.io> | 2024-05-24 11:33:06 +0200 |
commit | 73b99518f0e4eaa011fafdc760d416ae837d47a9 (patch) | |
tree | e5986693ec21438d3fd880787088d60c146dd51a | |
parent | 7cd483b37a2cc8d369da0757a4f94aa593ab5837 (diff) |
Fix shadowed models despite recievesShadows=false6.7
Even though Model::recievesShadows is set to false, sometimes the model
is rendered as completely shadowed. In the shadow mapping shader, the
light matrix is all zeroes when recievesShadows is false. As a
consequence of this we get a NaN value in 'smpCoord' and a division by
zero. We can mitigate this by simply checking if the 'shadowFactor' is
close to zero and just skip calling the shadow mapping function.
Pick-to: 6.5
Change-Id: I9ee6fe0219a7c4ca4b20c9cd24eaf9044d3d5fe6
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
(cherry picked from commit c17345351f4ebc9a45d0eb1e3f70b0012297a0e8)
Reviewed-by: Jonas Karlsson <jonas.karlsson@qt.io>
-rw-r--r-- | src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp b/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp index de35c66e..dcf264d3 100644 --- a/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp +++ b/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp @@ -365,11 +365,13 @@ static void generateShadowMapOcclusion(QSSGStageGeneratorBase &fragmentShader, fragmentShader.addUniform(names.shadowControlStem, "vec4"); fragmentShader.addUniform(names.shadowMatrixStem, "mat4"); + fragmentShader << " if (" << names.shadowControlStem << ".y > 0.01) {\n"; if (inType != QSSGRenderLight::Type::DirectionalLight) { - fragmentShader << " qt_shadow_map_occl = qt_sampleCubemap(" << names.shadowCubeStem << ", " << names.shadowControlStem << ", " << names.shadowMatrixStem << ", " << lightVarNames.lightPos << ".xyz, qt_varWorldPos, vec2(1.0, " << names.shadowControlStem << ".z));\n"; + fragmentShader << " qt_shadow_map_occl = qt_sampleCubemap(" << names.shadowCubeStem << ", " << names.shadowControlStem << ", " << names.shadowMatrixStem << ", " << lightVarNames.lightPos << ".xyz, qt_varWorldPos, vec2(1.0, " << names.shadowControlStem << ".z));\n"; } else { - fragmentShader << " qt_shadow_map_occl = qt_sampleOrthographic(" << names.shadowMapStem << ", " << names.shadowControlStem << ", " << names.shadowMatrixStem << ", qt_varWorldPos, vec2(1.0, " << names.shadowControlStem << ".z));\n"; + fragmentShader << " qt_shadow_map_occl = qt_sampleOrthographic(" << names.shadowMapStem << ", " << names.shadowControlStem << ", " << names.shadowMatrixStem << ", qt_varWorldPos, vec2(1.0, " << names.shadowControlStem << ".z));\n"; } + fragmentShader << " }\n"; } else { fragmentShader << " qt_shadow_map_occl = 1.0;\n"; } |