【发布时间】:2014-10-31 20:06:49
【问题描述】:
来自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"。
但是vec3、vec2 或float 类型可以使用多少种变量?
OpenGL ES 规范似乎暗示了这一点,但没有明确说明:
任何可变变量...都将计入此限制。
着色器访问超过
MAX_VARYING_VECTORS值得变量的程序可能无法链接
我做了两个猜测:
- 变化的
floats 的最大数量由下式给出:MAX_VARYING_VECTORS * 4
(每个vec4向量 4 个floats) - 如果(例如)
MAX_VARYING_VECTORS是8,则可以安全地使用以下各项,而不会导致任何链接错误:- 8
vec4变化 - 10
vec3变化 - 16
vec2变化 - 32
float变化 - 3
vec4、3vec3、3vec2和 5float变化 - 1
vec4可变长度数组8 - 1
vec3可变长度数组10 - 1
vec2可变长度数组16 - 1
float可变长度数组32 -
vec4/vec3/vec2/float变量或数组的任何其他组合,最多使用 32 个floats
- 8
所以我的MAX_VARYING_VECTORS 值为15,我想我最多可以使用60 个floats。
我的测试似乎证实了这一点。
例如,30 个 vec2 变量在我的机器上工作正常,但 31 会导致 "Varyings over maximum register limit" 链接错误。
所以我的问题是:
- 我的两个猜测是否正确?
- 如果
MAX_VARYING_VECTORS是8,那么使用16 个vec2变量是否安全?这可以保证始终有效吗?
【问题讨论】:
标签: opengl-es opengl-es-2.0 webgl