多个光源& GLSL法线贴图着色器的实现细节

时间:2014-10-29 21:55:12

标签: opengl libgdx glsl lwjgl

第一个问题是如何从单个光源到使用多个光源,而不使用多个片段着色器。

我的直觉是,着色器计算的每次运行都需要光源坐标,也许还有一些颜色信息,我们可以在n个光源的循环中完成计算。

如何将多个灯光传递到着色器程序?我是否使用一系列制服?我的猜测是用一系列制服传递每个光源的坐标,然后指定有多少光源,然后设置一个最大值。

我可以为着色器程序调用getter或setter方法吗?而不只是操纵全局变量?

我正在使用本教程和libGDX实现来学习如何执行此操作: https://gist.github.com/mattdesl/4653464

1 个答案:

答案 0 :(得分:4)

有许多方法可以拥有多个光源。我将指出3最常用的。

1)指定均匀结构阵列中的每个光源。在所有活动光上的着色器循环中进行光计算,并将结果累积为单个顶点颜色或碎片颜色,这取决于每个顶点或每个片段是否进行着色。 (这就是固定功能OpenGL计算多个灯光的方式)

2)每次通过启用单个光源的多通道渲染,最简单的形式通过可以通过加法混合(srcFactor = ONE dstFactor = ONE)进行合成。不要忘记在第一次从GL_LESS传递到GL_EQUAL后更改深度函数,或者只使用GL_LEQUAL进行所有传递。

3)许多环境照明算法模仿多个光源,假设它们与场景保持距离。最简单的渲染器应该将光强度存储到环境纹理(最好是立方体贴图)中,然后着色器工作就是在表面法线周围的方向上对该纹理进行多次采样,并使用一些随机角度偏移。