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

Handling multiple lights and GLSL shader programs

本文关键字:程序 GLSL 处理      更新时间:2023-10-16

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

当考虑到这一点时,与用于整个场景的深度立方体贴图相比,拥有单独的(小)深度立方体贴图似乎更合乎逻辑(尤其是对于近距离级别,而不是开放式场景),但实现这样的系统只会让我盯着屏幕看。

谢谢。

有很多方法可以实现您想要的。方法取决于你的确切需要。如果使用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或更高版本,则需要将灯光数据作为统一数据传递到着色器程序中。

当我过去处理阴影时,我会使用每个灯光的深度纹理。

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

如果您需要数百个灯光或类似的东西,也可以查看"延迟着色"。(另请参阅维基百科上关于延迟着色的条目。)