13

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

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

  • 绑定并清除 FP16 混合缓冲区(带深度缓冲区)
    • 仅深度通行证
    • 对于每个灯光,做一个附加的灯光通道
  • 绑定后台缓冲区,使用混合缓冲区作为纹理
    • 色调映射通道

为了提高这种方法的性能,我编写了一个新的渲染路径,它计算灯光的数量和类型,以动态构建自定义 GLSL 着色器。这些着色器接受所有光照参数作为制服,并在一次通过中完成所有光照。我预计会遇到某种限制,所以我先用一盏灯对其进行了测试。然后三个。然后是 21 个,没有错误或伪像,并且表现出色。这引出了我的实际问题:

制服的最大数量是可取的吗?

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

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

4

4 回答 4

11

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

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

于 2009-11-24T20:59:29.433 回答
3

请参阅4.3.5 统一的 OpenGL® 着色语言规范

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

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

于 2009-11-24T21:02:31.297 回答
2

有关如何获得 OpenGL 实现支持的最大数量,请参阅月影的答案。

要了解任意 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 个。

In short, It's unlikely you'll run out with anything that is DX10 based.

于 2009-11-24T21:15:39.757 回答
-6

我猜制服的最大数量取决于视频内存的数量,因为它只是一个变量。cpu上的普通变量也受您的RAM限制,对吗?

于 2009-11-24T20:44:22.613 回答