超过8个灯没有延迟着色/照明

时间:2014-06-30 00:12:35

标签: opengl glsl

我想知道在使用OpenGL和GLSL制作的场景中是否有任何技术(高效)使用8个以上的灯光。不使用延迟着色/照明。

我没有实现这些技术的局限性,也无法使用透明度或抗锯齿。

如果有一个好的选择,请用一个例子来描述它。

我使用的是OpenGL 2.0。

1 个答案:

答案 0 :(得分:2)

使用可编程管道,确实没有8个光源的限制。此限制仅适用于您在GLSL代码中访问预定义的统一变量(如gl_LightSource),并使用glLight*()种类的固定函数调用进行设置。在这种情况下,您确实仅限于GL_MAX_LIGHTS光源,至少为8。

但是,您可以轻松定义自己的制服,将照明模型所需的光源参数传递到着色器,而不是使用预定义的gl_LightSource制服。您可以在顶点着色器中将这些参数定义为uniform变量(如果使用每个顶点光照),并在代码中使用glUniform*()调用进行设置。

此方法可能遇到的限制是统一值的最大数量。在顶点着色器中,这是GL_MAX_VERTEX_UNIFORM_COMPONENTS浮点数,保证至少为512.这将为您提供128个向量。因此,如果您需要示例2个矢量来描述每个光源,那么将为您提供64个光源。并且大多数实现将支持远远超过最小512个统一值。

当然,拥有更多光源可能会影响性能。还有其他方法。例如,可以预先计算照明并将其存储在纹理中,例如,在立方体贴图纹理中。然后,不进行着色器中的光照计算,而是进行纹理查找。