2009-11-24 100 views
12

我一直在调整我的游戏的渲染器,用于我的笔记本电脑,它具有Radeon HD 3850.该芯片具有相当大的处理能力,但内存带宽有限,所以我一直试图移动更多着色器进入更少的传球。着色器限制

以前,我使用的是简单的多路径模型:

  • 绑定和清晰FP16共混物缓冲液(随深度缓冲器)
    • 深度仅通过
    • 对于每个光,做添加剂光通过
  • 绑定后备缓冲,使用混合缓冲作为纹理
    • 色调映射通过

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

是可回收的制服的最大数量?

这种方法在旧硬件上是可行的,还是更受限制的制服?

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

回答

11

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

您可以分别通过查询顶点和片段着色器的GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARBGL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB来检索最大值。

+6

请注意,对于GL2.0,您保证至少有512个顶点制服和64个片段制服。 – 2009-11-24 21:02:18

+1

哦,我的部分没有RTFM。 想到更多的问题: 浮动和整数是否每个都消耗一个组件? 包装有限制吗?四个花车相对于一个vec4?一个浮动和一个vec3? – mvanbem 2009-11-24 21:19:51

+2

@ mvanbem:一件制服至少占用一个4D矢量。所以,如果你对统一存储非常紧张,可以考虑将多个标量打包成一个4D矢量。 – 2009-11-25 18:11:49

-5

我猜制服的最大数量是由视频内存量决定的,因为它只是一个变量。 CPU上的正常变量也受到RAM的限制?

+1

制服有严格的硬件限制。现代硬件有很高的限制,但它们仍然存在。较旧的硬件(2年以上)可能有更低的限制。 – 2009-11-24 20:55:26

3

参见The的OpenGL着色语言specs4.3.5统一

上有存储量制服的实现依赖限制可用于 每种类型的,如果这着色器和超过它将导致编译时或链接时错误。已声明但未使用的统一变量 不计入此限制。

它会在链接或编译时失败,但不会使用该程序。

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个常数minumum - 你可以让他们的16。

简而言之,你不太可能会用到任何基于DX10的东西。