我想知道在使用OpenGL和GLSL制作的场景中是否有任何技术(高效)使用8个以上的灯光。不使用延迟着色/照明。
我没有实现这些技术的局限性,也无法使用透明度或抗锯齿。
如果有一个好的选择,请用一个例子来描述它。
我使用的是OpenGL 2.0。
答案 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个统一值。
当然,拥有更多光源可能会影响性能。还有其他方法。例如,可以预先计算照明并将其存储在纹理中,例如,在立方体贴图纹理中。然后,不进行着色器中的光照计算,而是进行纹理查找。