Opengl es WebGL着色器:可变变量的最大数量

Opengl es WebGL着色器:可变变量的最大数量,opengl-es,opengl-es-2.0,webgl,Opengl Es,Opengl Es 2.0,Webgl,根据第2.10.4节(着色器变量:可变变量): 可用于处理变化变量的插值器数量由实现相关常数MAX\u variable\u VECTORS给出 该值表示可以插值的四元素浮点向量的数目;声明为矩阵或数组的可变变量将使用多个插值器 链接程序时,由顶点着色器写入或由片段着色器读取的任何可变变量都将计入此限制 如果程序的着色器访问的变量超过了变量的MAX\u variable\u VECTORS值,则该程序可能无法链接 在我机器上的Chrome中,gl.getParameter(gl.MAX\u va

根据第2.10.4节(着色器变量:可变变量):

可用于处理变化变量的插值器数量由实现相关常数
MAX\u variable\u VECTORS
给出

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

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

如果程序的着色器访问的变量超过了变量的
MAX\u variable\u VECTORS
值,则该程序可能无法链接

在我机器上的Chrome中,
gl.getParameter(gl.MAX\u variable\u VECTORS)
返回
15
,这意味着我可以在着色器中使用15
vec4
变量

我已经通过一些测试验证了这一点。15
vec4
varyings工作正常,但当尝试使用16时,程序无法链接,并且
gl.getProgramInfoLog()
返回
“varyings超过最大寄存器限制”

但是可以使用多少个
vec3
vec2
float
类型的变量

OpenGL ES规范似乎暗示了这一点,但并不明确:

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

如果程序的着色器访问的变量超过了变量的
MAX\u variable\u VECTORS
值,则该程序可能无法链接

我有两个猜测:

  • 变化的
    float
    s的最大数量由以下公式给出:
    最大可变向量*4

    (4
    float
    s每
    vec4
    vector)
  • 如果(例如)
    MAX\u variable\u VECTORS
    8
    ,则可以安全地使用以下各项,而不会导致任何链接错误:
    • 8
      vec4
      varyings
    • 10
      vec3
      varyings
    • 16
      vec2
      varyings
    • 32
      float
      varyings
    • 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
  • 因此,对于我的
    MAX\u variable\u VECTORS
    15
    ,我想我可以使用最大60
    float
    s。 我的测试似乎证实了这一点。 例如,30
    vec2
    varyings在我的机器上正常工作,但31导致
    “varyings超过最大寄存器限制”
    链接错误

    因此,我的问题是:

    • 我的两个猜测正确吗
    • 如果
      MAX\u variable\u VECTORS
      8
      ,那么使用16
      vec2
      变量是否安全?这保证永远有效吗
    来自WebGL规范

    6.24制服和制服的包装限制

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

    因此,是的,如果您阅读算法if
    MAX\u variable\u VECTORS
    为8,您可以使用16
    vec2
    s。但是,您不能使用10
    vec3
    s。您只能使用8
    vec3
    s


    还有数组限制。例如,如果
    MAX\u variable\u VECTORS
    为8,则
    float
    s数组不能大于8,也不能使
    vec2
    数组大于8。

    非常感谢。对打包算法的描述非常有用,特别是:“目标体系结构由寄存器网格组成,
    MAX\u variable\u VECTORS
    行乘以4列表示变量。每个寄存器可以包含一个
    float
    值。不允许对变量进行拆分。向量始终占用单行寄存器。”这就解释了为什么不允许使用10
    vec3
    s。“数组的元素必须在不同的行中。”因此数组不能有超过
    MAX\u variable\u VECTORS
    的元素。这一点似乎也需要注意:“如果在片段着色器中引用(预处理后),则内置特殊变量(
    gl_FragCoord
    gl_FrontFacing
    gl_PointCoord
    )在计算varyings的存储需求时被包括在内。”@TachyonVortex我知道这是一篇有点陈旧的帖子,但似乎数组限制并不总是适用。在我的Mac电脑上的Firefox上,
    gl.getParameter(gl.MAX\u变量向量)
    返回16,但我可以使用32个元素的
    vec2
    数组。然而,在Chrome上,我的
    MAX\u variable\u VECTORS
    是31,浏览器拒绝链接程序,说
    VARYING超过了最大寄存器限制
    。我需要一个大约50个元素的
    vec2
    数组,我想知道如何实现这一点。这看起来像是firefox 36中的一个错误。我在Mac上失败。检查(FF 39)它似乎已修复。也许你应该试试看,看看你的程序是否开始具有与Chrome相同的行为。至于需要50个Vec2,听起来你是S.O.L。如果
    MAX\u variable\u VECTORS
    是16 m