Skip to content

Commit 15d48a1

Browse files
NEDJIMAbelgacemnyalldawson
authored andcommittedJan 31, 2022
- Fix shadow rendering (fix light camera setting mistake)
- Add depth and shadow texture coordinates checking - Improve performance by selecting front faces for forward pass and back faces for shadow pass
1 parent 9ba642f commit 15d48a1

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed
 

‎src/3d/qgsshadowrenderingframegraph.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,17 @@ Qt3DRender::QFrameGraphNode *QgsShadowRenderingFrameGraph::constructForwardRende
9090
mForwardClearBuffers->setBuffers( Qt3DRender::QClearBuffers::ColorDepthBuffer );
9191
mForwardClearBuffers->setClearDepthValue( 1.0f );
9292

93-
mFrustumCulling = new Qt3DRender::QFrustumCulling( mForwardClearBuffers );
93+
Qt3DRender::QRenderStateSet *forwaredRenderStateSet = new Qt3DRender::QRenderStateSet( mForwardClearBuffers );
94+
95+
Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
96+
depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
97+
forwaredRenderStateSet->addRenderState( depthTest );
98+
99+
Qt3DRender::QCullFace *cullFace = new Qt3DRender::QCullFace;
100+
cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Back );
101+
forwaredRenderStateSet->addRenderState( cullFace );
102+
103+
mFrustumCulling = new Qt3DRender::QFrustumCulling( forwaredRenderStateSet );
94104

95105
return mMainCameraSelector;
96106
}
@@ -133,7 +143,7 @@ Qt3DRender::QFrameGraphNode *QgsShadowRenderingFrameGraph::constructShadowRender
133143
mShadowRenderStateSet->addRenderState( shadowDepthTest );
134144

135145
Qt3DRender::QCullFace *shadowCullFace = new Qt3DRender::QCullFace;
136-
shadowCullFace->setMode( Qt3DRender::QCullFace::NoCulling );
146+
shadowCullFace->setMode( Qt3DRender::QCullFace::CullingMode::Front );
137147
mShadowRenderStateSet->addRenderState( shadowCullFace );
138148

139149
return mLightCameraSelectorShadowPass;
@@ -142,7 +152,7 @@ Qt3DRender::QFrameGraphNode *QgsShadowRenderingFrameGraph::constructShadowRender
142152
Qt3DRender::QFrameGraphNode *QgsShadowRenderingFrameGraph::constructPostprocessingPass()
143153
{
144154
mPostProcessingCameraSelector = new Qt3DRender::QCameraSelector;
145-
mPostProcessingCameraSelector->setCamera( mMainCamera );
155+
mPostProcessingCameraSelector->setCamera( mLightCamera );
146156

147157
mPostprocessPassLayerFilter = new Qt3DRender::QLayerFilter( mPostProcessingCameraSelector );
148158
mPostprocessPassLayerFilter->addLayer( mPostprocessPassLayer );
@@ -419,7 +429,11 @@ void calculateViewExtent( Qt3DRender::QCamera *camera, float shadowRenderingDist
419429
QVector3D( 0.0f, 0.0f, depth ),
420430
QVector3D( 0.0f, 1.0f, depth ),
421431
QVector3D( 1.0f, 0.0f, depth ),
422-
QVector3D( 1.0f, 1.0f, depth )
432+
QVector3D( 1.0f, 1.0f, depth ),
433+
QVector3D( 0.0f, 0.0f, 0 ),
434+
QVector3D( 0.0f, 1.0f, 0 ),
435+
QVector3D( 1.0f, 0.0f, 0 ),
436+
QVector3D( 1.0f, 1.0f, 0 )
423437
};
424438
maxX = std::numeric_limits<float>::lowest();
425439
maxY = std::numeric_limits<float>::lowest();

‎src/3d/shaders/postprocess.frag

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ float CalcShadowFactor(vec4 LightSpacePos)
6666
UVCoords.y = 0.5 * ProjCoords.y + 0.5;
6767
float z = 0.5 * ProjCoords.z + 0.5;
6868

69+
if ( UVCoords.x < 0 || UVCoords.x > 1 || UVCoords.y < 0 || UVCoords.y > 1 )
70+
return 1.0;
71+
6972
// percentage close filtering of the shadow map
7073
float shadow = 0.0;
7174
int k = 1;
@@ -109,14 +112,17 @@ float edlFactor(vec2 coords)
109112

110113
void main()
111114
{
112-
vec3 worldPosition = WorldPosFromDepth(texture(depthTexture, texCoord).r);
115+
float depth = texture(depthTexture, texCoord).r;
116+
vec3 worldPosition = WorldPosFromDepth( depth );
113117
vec4 positionInLightSpace = projectionMatrix * viewMatrix * vec4(worldPosition, 1.0f);
114118
positionInLightSpace /= positionInLightSpace.w;
115119
vec3 color = texture(colorTexture, texCoord).rgb;
116120
// if shadow rendering is disabled or the pixel is outside the shadow rendering distance don't render shadows
117-
if (renderShadows == 0 || worldPosition.x > shadowMaxX || worldPosition.x < shadowMinX || worldPosition.z > shadowMaxZ || worldPosition.z < shadowMinZ) {
118-
fragColor = vec4(color.rgb, 1.0f);
119-
} else {
121+
if (renderShadows == 0 || depth >= 1 || worldPosition.x > shadowMaxX || worldPosition.x < shadowMinX || worldPosition.z > shadowMaxZ || worldPosition.z < shadowMinZ)
122+
{
123+
fragColor = vec4(color, 1.0f);
124+
} else
125+
{
120126
float visibilityFactor = CalcShadowFactor(positionInLightSpace);
121127
fragColor = vec4(visibilityFactor * color, 1.0f);
122128
}

0 commit comments

Comments
 (0)
Please sign in to comment.