我一直在调整我的笔记本电脑的渲染器,它有一台Radeon HD 3850.这款芯片具有相当大的处理能力,但内存带宽有限,所以我一直试图将更多着色器工作转移到传球次数减少。
以前,我使用的是简单的多通道模型:
为了提高此方法的性能,我编写了一个新的渲染路径,用于计算动态构建自定义GLSL着色器的灯光数量和类型。这些着色器接受所有光参数作为制服,并在一次通过中完成所有照明。我期待遇到某种限制,所以我先用一盏灯测试它。然后三个。然后二十一,没有错误或文物,并有很好的表现。这引出了我的实际问题:
可以检索最大制服数量吗?
这种方法在较旧的硬件上是否可行,或者制服是否更加有限?
如果我把它推得太远,我会在什么时候出错?着色器编译?程序链接?使用该程序?
答案 0 :(得分:11)
着色器制服通常由硬件实现为寄存器(或者有时通过将值直接修补到着色器微码,例如nVidia片段着色器)。因此,该限制高度依赖于实现。
您可以通过分别查询GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB
和GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB
的顶点和片段着色器来检索最大值。
答案 1 :(得分:3)
参见OpenGL®着色语言的{strong> 4.3.5统一 specs:
可以使用的制服的存储量存在依赖于实现的限制 每种类型的着色器,如果超出此类,将导致编译时或链接时错误。制服 声明但未使用的变量不计入此限制。
它会在链接或编译时失败,但不会使用该程序。
答案 2 :(得分:2)
有关如何获得OpenGL实现支持的最大数量,请参阅moonshadow的答案。
为了了解任意GPU的实际限制,我建议查看GPU支持的DX版本。
DX9级硬件:
vs2_0
支持256 vec4。 ps2_0
支持32 vec4。vs3_0
是256 vec4,ps3_0
是224 vec4。DX10级硬件:
vs4_0/ps4_0
是每个常量缓冲区4096个常量的最小值 - 你可以有16个。
简而言之,你不太可能会遇到任何基于DX10的东西。
答案 3 :(得分:-6)
我猜制服的最大数量取决于视频内存的数量, 因为它只是一个变量。 cpu上的正常变量是否受RAM限制?