阴影贴图绘制顺序

时间:2016-01-21 23:30:52

标签: opengl shadow framebuffer

在此处学习本教程: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&amp; shader)函数以最后渲染大房间立方体,阴影就会消失!

这不会发生在教程中的源代码中,这让Sherlock认为这与我所做的更改有关。如果对此的解决方案是微不足道的话,我也不会感到惊讶,请离开!

1 个答案:

答案 0 :(得分:1)

  

只要我首先从光源中进一步绘制物体,这就有效。

当然可以。因为您不再拥有深度缓冲区。如果没有深度缓冲,您就不会进行深度测试。如果没有深度测试,您就不会隐藏表面消除。所以最后绘制的片段总是胜利。

为什么 LearnOpenGL.org代码使用分层深度图像作为渲染目标。

如果你坚持要将深度渲染为GL_R32F图像(我不知道你为什么需要),那么你就必须这两个 a分层颜色缓冲区和分层深度缓冲区。你的lightDistance需要进入他们两个。