着色器限制

mva*_*bem 13 c++ opengl shader glsl

我一直在为我的笔记本电脑调整我的游戏渲染器,它有一台Radeon HD 3850.这款芯片具有相当大的处理能力,但内存带宽有限,所以我一直试图将更多着色器工作转移到更少的传递.

以前,我使用的是简单的多通道模型:

  • 绑定并清除FP16混合缓冲区(带深度缓冲区)
    • 深度通过
    • 对于每盏灯,进行附加光通过
  • 绑定后备缓冲区,使用混合缓冲区作为纹理
    • 色调映射传递

为了提高这种方法的性能,我编写了一个新的渲染路径,它计算了动态构建自定义GLSL着色器的灯光数量和类型.这些着色器接受所有光参数作为制服,并在一次通过中完成所有照明.我期待遇到某种限制,所以我先用一盏灯测试它.然后三个.然后二十一,没有错误或文物,并有很好的表现.这引出了我的实际问题:

是否可以检索最大制服数量?

这种方法在较旧的硬件上是否可行,或者制服是否更加有限?

如果我把它推得太远,我会在什么时候出错?着色器编译?程序链接?使用该程序?

moo*_*dow 11

着色器制服通常由硬件实现为寄存器(或者有时通过将值直接修补到着色器微码,例如nVidia片段着色器).因此,该限制高度依赖于实现.

您可以通过查询GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB以及GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB顶点和片段着色器分别检索最大值.

  • 请注意,对于GL2.0,您可以保证至少有512个顶点制服和64个片段制服. (6认同)
  • @mvanbem:一件制服至少占用一个4D矢量.因此,如果您对统一存储非常紧张,请考虑将多个标量包装到一个4D矢量中. (2认同)