阴影贴图绘制顺序
Shadow map draw order
在此处学习本教程:http://learnopengl.com/#!Advanced-Lighting/Shadows/Point-Shadows
我有一个简单完美的全向阴影贴图。
这是 GitHub 来源:https://github.com/JoeyDeVries/LearnOpenGL/tree/master/src/5.advanced_lighting/3.2.point_shadows
但是,当我更改帧缓冲区以存储浮动时,绘制顺序变得很重要。 这是我的问题
让我解释一下。
为了创建帧缓冲区,我改变了这个:
for (GLuint i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
......
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthCubemap, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
对此:
for (GLuint i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_R32F, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL);
......
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, depthCubemap, 0);
然后我将片段阴影贴图着色器更改为:
gl_FragDepth = lightDistance;
对此:
out vec4 color;
void main() {
....
// gl_FragDepth = lightDistance; // I commented this out...
color = vec4(lightDistance, 0, 0, 1);
}
只要我先把物体画得离光源远一点就可以了。但是,如果我更改 RenderScene(Shader &shader) 函数以最后渲染大房间立方体,阴影就会消失!
教程中的源代码不会发生这种情况,这让我的 Sherlock 认为这与我所做的更改有关。如果这个问题的解决方案是微不足道的,我不会感到惊讶,所以,请开火!
Which works as long as I draw the objects further from the light source first.
当然可以。因为你不再有 深度缓冲区 。没有深度缓冲区,就没有深度测试。如果没有深度测试,就没有隐藏面消除。所以最后绘制的片段总是获胜。
这就是 LearnOpenGL.org 代码使用分层深度图像作为其渲染目标的原因。
如果您坚持将深度渲染到 GL_R32F
图像(我不知道您为什么需要这样做),那么您将不得不 both 一个分层颜色缓冲区和一个分层深度缓冲区。而你的 lightDistance
需要进入他们两个。
在此处学习本教程:http://learnopengl.com/#!Advanced-Lighting/Shadows/Point-Shadows 我有一个简单完美的全向阴影贴图。 这是 GitHub 来源:https://github.com/JoeyDeVries/LearnOpenGL/tree/master/src/5.advanced_lighting/3.2.point_shadows
但是,当我更改帧缓冲区以存储浮动时,绘制顺序变得很重要。 这是我的问题
让我解释一下。
为了创建帧缓冲区,我改变了这个:
for (GLuint i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
......
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthCubemap, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
对此:
for (GLuint i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_R32F, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL);
......
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, depthCubemap, 0);
然后我将片段阴影贴图着色器更改为:
gl_FragDepth = lightDistance;
对此:
out vec4 color;
void main() {
....
// gl_FragDepth = lightDistance; // I commented this out...
color = vec4(lightDistance, 0, 0, 1);
}
只要我先把物体画得离光源远一点就可以了。但是,如果我更改 RenderScene(Shader &shader) 函数以最后渲染大房间立方体,阴影就会消失!
教程中的源代码不会发生这种情况,这让我的 Sherlock 认为这与我所做的更改有关。如果这个问题的解决方案是微不足道的,我不会感到惊讶,所以,请开火!
Which works as long as I draw the objects further from the light source first.
当然可以。因为你不再有 深度缓冲区 。没有深度缓冲区,就没有深度测试。如果没有深度测试,就没有隐藏面消除。所以最后绘制的片段总是获胜。
这就是 LearnOpenGL.org 代码使用分层深度图像作为其渲染目标的原因。
如果您坚持将深度渲染到 GL_R32F
图像(我不知道您为什么需要这样做),那么您将不得不 both 一个分层颜色缓冲区和一个分层深度缓冲区。而你的 lightDistance
需要进入他们两个。