根据 OpenGL ES 规范 第 2.10.4 节(着色器变量:varying 变量):
可用于处理 varying 变量的插值器数量由实现相关的常量
MAX_VARYING_VECTORS
给出。该值表示可以插值的 四元素浮点向量 的数量;声明为矩阵或数组的 varying 变量将消耗多个插值器。
在链接程序时,任何被顶点着色器写入或由片段着色器读取的 varying 变量都会占用此限制。
如果着色器访问超过
MAX_VARYING_VECTORS
值的 varying 变量,则该程序可能无法成功链接。
在我的机器上,Chrome 中运行 gl.getParameter(gl.MAX_VARYING_VECTORS)
返回 15
,这意味着我可以在着色器中使用 15 个 vec4
varying。
我做了一些测试来验证它。15 个 vec4
varying 可以正常工作,但尝试使用 16 个时,程序无法链接,gl.getProgramInfoLog()
返回 "Varyings over maximum register limit"
。
但有多少个类型为 vec3
、vec2
或 float
的 varying 可以使用呢?
OpenGL ES 规范似乎在暗示这一点,而没有明确说明:
任何 varying 变量...都将占用此限制。
如果着色器访问超过
MAX_VARYING_VECTORS
值的 varying 变量,则该程序可能无法成功链接。
我有两个猜测:
- 可变浮点数的最大数量为:
MAX_VARYING_VECTORS * 4
(每个vec4
向量有4个float
) - 例如,如果
MAX_VARYING_VECTORS
是8
,则以下每个选项都可以安全使用而不会导致任何链接错误:- 8个
vec4
可变数 - 10个
vec3
可变数 - 16个
vec2
可变数 - 32个
float
可变数 - 3个
vec4
、3个vec3
、3个vec2
和5个float
可变数 - 长度为
8
的1个vec4
可变数组 - 长度为
10
的1个vec3
可变数组 - 长度为
16
的1个vec2
可变数组 - 长度为
32
的1个float
可变数组 - 任何其他
vec4
/vec3
/vec2
/float
变量或数组的组合,最多使用32个float
- 8个
因此,对于我的MAX_VARYING_VECTORS
值为15
,我猜最多可以使用60个float
。
我的测试似乎证实了这一点。
例如,在我的机器上,30个vec2
可变数可以正常工作,但31个会导致"Varyings over maximum register limit"
链接错误。
所以我的问题是:
- 我的两个猜测正确吗?
- 如果
MAX_VARYING_VECTORS
是8
,那么使用16个vec2
可变数是否安全?这保证总是能够工作吗?
MAX_VARYING_VECTORS
列 4 个用于变量。每个寄存器可以包含一个float
值。不允许拆分变量。向量始终占据单行寄存器。”这解释了为什么不允许使用 10 个vec3
。“数组的元素必须在不同的行中。”因此,一个数组不能超过MAX_VARYING_VECTORS
个元素。 - TachyonVortexgl_FragCoord
,gl_FrontFacing
和gl_PointCoord
)。 - TachyonVortexgl.getParameter(gl.MAX_VARYING_VECTORS)
返回16,但我能够使用32个元素的vec2
数组。然而,在Chrome上,我的MAX_VARYING_VECTORS
为31,浏览器拒绝链接程序,说Varyings over maximum register limit
。我需要一个大约50个元素的varyingvec2
数组,想知道如何实现。 - Daniel WMAX_VARYING_VECTORS
是16,那么你最多只能有32个vec2s。 - gman