我一直在为配备 Radeon HD 3850 的笔记本电脑调整游戏的渲染器。该芯片具有不错的处理能力,但内存带宽有限,因此我一直在尝试将更多的着色器工作转移到更少的传球次数。
以前,我使用的是简单的多 channel 模型:
-
绑定(bind)并清除 FP16 混合缓冲区(带深度缓冲区)
- 仅深度通行证
- 对每个灯光,做一个附加的灯光 channel
-
绑定(bind)后台缓冲区,使用混合缓冲区作为纹理
- 色调映射 channel
为了提高这种方法的性能,我编写了一个新的渲染路径,用于计算灯光的数量和类型,以动态构建自定义 GLSL 着色器。这些着色器接受所有光照参数作为制服,并在一次通过中完成所有光照。我预计会遇到某种限制,所以我先用一盏灯对其进行了测试。然后三个。然后是 21 个,没有错误或伪像,并且表现出色。这引出了我的实际问题:
Is the maximum number of uniforms retrievable?
Is this method viable on older hardware, or are uniforms much more limited?
If I push it too far, at what point will I get an error? Shader compilation? Program linking? Using the program?
最佳答案
着色器统一通常由硬件作为寄存器实现(或者有时通过将值直接修补到着色器微代码中,例如 nVidia 片段着色器)。因此,该限制高度依赖于实现。
您可以通过分别查询顶点和片段着色器的 GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB
和 GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB
来检索最大值。
关于c++ - 着色器限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792776/