处理多个灯光和GLSL着色器程序

时间:2013-02-17 10:01:42

标签: c++ opengl glsl

我有一个点光阴影贴图程序,但在如何控制多光场景方面有点迷失。如何设置多个灯光,每个灯光都有自己的“深度纹理”?如果是这样,它们如何组合以用于场景的最终渲染(显然,并非所有灯都会一直处于活动状态)?

当考虑到这一点时,单独(小)深度立方体贴图似乎更合乎逻辑,而不是用于整个场景(特别是对于近距离水平而不是开放景观),但是实现这样一个系统只是让我盯着屏幕。

感谢。

1 个答案:

答案 0 :(得分:1)

有很多方法可以达到你想要的效果。该方法取决于您的确切需求。如果您使用的是OpenGL 2.1或更早版本,则可以通过启用多个OpenGL灯来设置多个灯:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, <light 0 settings>);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, <light 1 settings>);
...etc. with up to GL_MAX_LIGHTS lights

如果您想要超过GL_MAX_LIGHTS灯光,或者您正在使用OpenGL 3或更高版本,则需要将灯光数据作为制服传递到着色器程序中。例如。

当我过去使用阴影时,我每个光都使用深度纹理。

要组合它们,通常会针对每个光测试每个片段。如果片段对光可见(即不在阴影中),则添加光的贡献。如果片段处于阴影中(光线不可见),那么您不会添加该灯光的贡献。

如果你需要数百个灯或类似的东西,你也可以查看Deferred Shading。 (另见the Wikipedia entry on Deferred Shading。)