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

Tac*_*tex 8 opengl-es webgl opengl-es-2.0

OpenGL ES规范部分2.10.4(着色器变量:变量变量):

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

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

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

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

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

我通过一些测试验证了这一点.15种变化vec4可以正常工作,但是当试图使用16时,程序无法链接并gl.getProgramInfoLog()返回"Varyings over maximum register limit".

但是,有多少类型的varyings vec3,vec2或者float可以用吗?

OpenGL ES规范似乎暗示了这一点,没有明确:

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

其着色器访问多了一个程序MAX_VARYING_VECTORS 价值变化的变量可能无法链接

我正在做两个猜测:

  1. 变化floats 的最大数量由下式给出:(每个矢量
    MAX_VARYING_VECTORS * 4
    4 floats vec4)
  2. 如果(例如)MAX_VARYING_VECTORS8,则可以安全地使用以下每个而不会导致任何链接错误:
    • 8个vec4varyings
    • 10个vec3varyings
    • 16个vec2varyings
    • 32个floatvaryings
    • 3 vec4,3 vec3,3 vec2和5 floatvaryings
    • 1个vec4不同长度的数组8
    • 1个vec3不同长度的数组10
    • 1个vec2不同长度的数组16
    • 1个float不同长度的数组32
    • vec4/ vec3/ vec2/ float变量或数组的任何其他组合,最多使用32 float

所以我的MAX_VARYING_VECTORS价值15,我想我可以使用最多60 float秒.我的测试似乎证实了这一点.例如,30个变化vec2在我的机器上正常工作,但31导致"Varyings over maximum register limit"链接错误.

所以我的问题是:

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

gma*_*man 8

来自WebGL规范

6.24制服和不同的包装限制

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

所以,是的,如果您读取算法,如果MAX_VARYING_VECTORS是8,则可以使用16 vec2秒.但是你不能使用10 vec3秒.你只能使用8 vec3

还有数组限制.例如,如果是8,则不能有float大于8 的s 数组,也不能有大于8的数组.vec2MAX_VARYING_VECTORS