WebGL着色器:变量变量的最大数量

时间:2014-10-31 20:06:49

标签: opengl-es opengl-es-2.0 webgl

来自OpenGL ES spec部分2.10.4(着色器变量:变量变量):

  

可用于处理变量变量的插值器数由依赖于实现的常量 MAX_VARYING_VECTORS 给出。

     

此值表示可以插值的四元素浮点矢量的数量;声明为矩阵或数组的变量变量将使用多个插值器。

     

当程序被链接时,由顶点着色器写入或由片段着色器读取的任何变化变量都将计入此限制。

     

着色器访问超过MAX_VARYING_VECTORS个变量变量的程序可能无法链接

在我的计算机上的Chrome中,gl.getParameter(gl.MAX_VARYING_VECTORS)返回15,这意味着我可以在着色器中使用15 vec4个变换。

我通过一些测试验证了这一点。 15个vec4更改工作正常,但尝试使用16时,程序无法链接,gl.getProgramInfoLog()返回"Varyings over maximum register limit"

但是可以使用vec3vec2float类型的多少种变体?

OpenGL ES规范似乎暗示了这一点,而不是明确的:

  

任何变化的变量......都将计入此限制。

     

其着色器访问超过MAX_VARYING_VECTORS 变量变量的程序可能无法链接

我做了两个猜测:

  1. 变化float的最大数量由下式给出:
    MAX_VARYING_VECTORS * 4
    (每个float向量{4} vec4 s
  2. 如果(例如)MAX_VARYING_VECTORS8,则可以安全地使用以下各项而不会导致任何链接错误:
    • 8 vec4变化
    • 10 vec3变化
    • 16 vec2变化
    • 32 float变化
    • 3 vec4,3 vec3,3 vec2和5 float种变化
    • 1 vec4不同长度的数组8
    • 1 vec3不同长度的数组10
    • 1 vec2不同长度的数组16
    • 1 float不同长度的数组32
    • vec4 / vec3 / vec2 / float个变量或数组的任何其他组合,最多使用32 float s
  3. 因此,MAX_VARYING_VECTORS的{​​{1}}值为15,我想我最多可以使用float秒。 我的测试似乎证实了这一点。 例如,30 vec2个变换在我的计算机上正常工作,但31会导致"Varyings over maximum register limit"链接错误。

    所以我的问题是:

    • 我的两个猜测是否正确?
    • 如果MAX_VARYING_VECTORS8,那么使用16 vec2种变体是否安全?这保证总是有效吗?

1 个答案:

答案 0 :(得分:8)

来自WebGL规范

  

6.24制服和不同的包装限制

     

OpenGL ES着色语言,版本1.00 [GLES20GLSL],附录A,第7节"变化和制服的计数"定义了一种保守算法,用于计算着色器中所有均匀变量和变量变量所需的存储空间。 GLSL ES规范要求如果附录A中定义的打包算法成功,则着色器必须在目标平台上成功编译。 WebGL API进一步要求,如果打包算法对着色器的统一变量或程序的变量变量失败,则编译或链接必须失败。

是的,如果您在MAX_VARYING_VECTORS为8时阅读算法,则可以使用16 vec2 s。但是,您不能使用10 vec3 s。您只能使用8 vec3 s

还有数组限制。例如,如果float为8,那么vec2大于8的数组也不会大于MAX_VARYING_VECTORS的数组。