2

我正在尝试使用 OpenGL 和 GLSL 实现延迟着色器,但我遇到了光照几何问题。这些是我正在采取的步骤:

Bind multitarget framebuffer
Render color, position, normal and depth
Unbind framebuffer
Enable blend
Disable depth testing
Render every light
Enable depth testing
Disable blend
Render to screen

但是因为我只渲染正面,当我在灯光里面时它会完全消失,渲染背面不起作用,因为我会得到双倍的光功率(当在里面时,一半[或正常数量] )。

如何从光照几何体的内部和外部渲染相同的光照值?

4

2 回答 2

3

就我而言,我这样做:

Bind gbuffer framebuffer
Render color, position, normal
Unbind framebuffer

Enable blend
Enable depth testing

glDepthMask(0);
glCullFace(GL_FRONT);   //to render only backfaces
glDepthFunc(GL_GEQUAL); //to test if light fragment is "behind geometry", or it shouldn't affect it
Bind light framebuffer
Blit depth from gbuffer to light framebuffer //so you can depth-test light volumes against geometry
Render every light
于 2013-01-19T22:48:28.897 回答
2

如果我没记错的话,在我的延迟渲染器中,我只渲染体积的背面。缺点是您无法进行深度测试,您只会在完成灯光计算后知道灯光是否位于几何体后面并丢弃像素。 正如另一个答案所解释的,您可以进行深度测试。测试大于或等于以查看背面是在几何体后面还是在几何体上,因此与几何体的表面相交。

或者,您可以在渲染时检查您是否在光体积内并相应地切换正面。

于 2013-01-19T21:06:21.473 回答