aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Karlsson <jonas.karlsson@qt.io>2024-05-16 08:47:08 +0200
committerJonas Karlsson <jonas.karlsson@qt.io>2024-05-24 11:33:06 +0200
commit73b99518f0e4eaa011fafdc760d416ae837d47a9 (patch)
treee5986693ec21438d3fd880787088d60c146dd51a
parent7cd483b37a2cc8d369da0757a4f94aa593ab5837 (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.cpp6
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";
}