2013-02-17 78 views
1

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

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

谢谢。

回答

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。)

+0

感谢您的回复。我使用的是OpenGL 3.3,并没有试图使用数百个灯,并且可以想象我只需要几个灯就可以一次处于活动状态。我已经为每个灯光提供了一个立方体贴图,但是我想知道如何在着色器中通过它们进行最终渲染,因为每个灯光都有自己的纹理。唯一想到的就是将每个元素绑定到一个新的元素,比如多纹理,但这看起来很浪费。 – Rebirth 2013-02-18 18:54:59