Opengl es WebGL着色器:可变变量的最大数量
根据第2.10.4节(着色器变量:可变变量): 可用于处理变化变量的插值器数量由实现相关常数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
MAX\u variable\u VECTORS
给出
该值表示可以插值的四元素浮点向量的数目;声明为矩阵或数组的可变变量将使用多个插值器
链接程序时,由顶点着色器写入或由片段着色器读取的任何可变变量都将计入此限制
如果程序的着色器访问的变量超过了变量的MAX\u variable\u VECTORS
值,则该程序可能无法链接
在我机器上的Chrome中,gl.getParameter(gl.MAX\u variable\u VECTORS)
返回15
,这意味着我可以在着色器中使用15vec4
变量
我已经通过一些测试验证了这一点。15vec4
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
varyingsvec4
- 10
varyingsvec3
- 16
varyingsvec2
- 32
varyingsfloat
- 3
、3vec4
、3vec3
和5vec2
变量float
- 1
可变长度数组vec4
8
- 1
可变长度数组vec3
10
- 1
可变长度数组vec2
16
- 1
可变长度数组float
32
/vec4
/vec3
/vec2
变量或数组的任何其他组合,最多使用32个float
sfloat
MAX\u variable\u VECTORS
值15
,我想我可以使用最大60float
s。
我的测试似乎证实了这一点。
例如,30vec2
varyings在我的机器上正常工作,但31导致“varyings超过最大寄存器限制”
链接错误
因此,我的问题是:
- 我的两个猜测正确吗
- 如果
为MAX\u variable\u VECTORS
,那么使用168
变量是否安全?这保证永远有效吗vec2
MAX\u variable\u VECTORS
为8,您可以使用16vec2
s。但是,您不能使用10vec3
s。您只能使用8vec3
s
还有数组限制。例如,如果
MAX\u variable\u VECTORS
为8,则float
s数组不能大于8,也不能使vec2
数组大于8。非常感谢。对打包算法的描述非常有用,特别是:“目标体系结构由寄存器网格组成,MAX\u variable\u VECTORS
行乘以4列表示变量。每个寄存器可以包含一个float
值。不允许对变量进行拆分。向量始终占用单行寄存器。”这就解释了为什么不允许使用10vec3
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