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

Opengl 超过8个没有延迟着色/照明的灯光,opengl,glsl,Opengl,Glsl,我想知道是否有任何技术(有效)可以在一个场景中使用8个以上的灯光​​使用OpenGL和GLSL。不使用延迟着色/照明 由于这些技术的局限性以及无法使用透明度或抗锯齿,我还没有实现它们 如果有好的替代方案,请举例说明 我使用OpenGL 2.0。使用可编程管道,实际上没有8个光源的限制。仅当您在GLSL代码中访问预定义的统一变量(如gl_LightSource),并使用glLight*()品种的固定函数调用对其进行设置时,此限制才适用。在这种情况下,您实际上仅限于GL_MAX_LIGHTS光源,至

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

由于这些技术的局限性以及无法使用透明度或抗锯齿,我还没有实现它们

如果有好的替代方案,请举例说明


我使用OpenGL 2.0。

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

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

这种方法可能遇到的限制是统一值的最大数量。在顶点着色器中,这是
GL_MAX_vertex_UNIFORM_COMPONENTS
float,保证至少为512。这将给你128个向量。所以,如果你需要2个向量来描述每个光源,那么你可以得到64个光源。大多数实现将支持比最小512个统一值多得多的值


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

固定功能或可编程管道?可编程管道(GLSL)…argh,我的阅读理解失败,抱歉。使用添加混合进行多通道照明(在您的情况下,无论出于何种原因,每次应用8个灯光)。这就是从时间的黎明开始,延迟着色就是这样做的,延迟着色只是改变了它,这样你就不必在每次照明过程中反复绘制几何体。相对于延迟着色/照明,效率有多高?我认为你可能混淆了OpenGL ES 2.0对最大均匀组件的限制。在desktop GL中,最小值为1024,即256
vec4
s。您所说的后者似乎很有趣。你把这种技术叫做什么?@AndonM.Coleman:我查阅了OpenGL 2.1规范(glspec21.20061201.pdf,表6.36,第301页)。@RetoKoradi:啊,好的。答案针对GLSL 1.20/1.10。自GLSL 1.30以来,
gl_MaxVertexUniformComponents
所需的最小值为1024。我不认为您会将这样做的立方体贴图称为灯光贴图,因为立方体贴图基本上用于投影多个光源的贡献(基本上仍在执行正常照明等式,但在一个位置用探针替换数十个灯光),其中作为光照贴图实际上是在曲面本身上使用预先计算的光进行采样。我从未见过用作光照贴图的立方体贴图。我认为,由于立方体贴图的引入,我们正在考虑两件不同的事情。