着色器限制

时间:2009-11-24 20:38:36

标签: c++ opengl glsl shader

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

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

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

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

  

可以检索最大制服数量吗?

     

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

     

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

4 个答案:

答案 0 :(得分:11)

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

您可以通过分别查询GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARBGL_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限制?