来自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
值 变量变量的程序可能无法链接
我做了两个猜测:
float
的最大数量由下式给出:MAX_VARYING_VECTORS * 4
float
向量{4} vec4
s MAX_VARYING_VECTORS
为8
,则可以安全地使用以下各项而不会导致任何链接错误:
vec4
变化vec3
变化vec2
变化float
变化vec4
,3 vec3
,3 vec2
和5 float
种变化vec4
不同长度的数组8
vec3
不同长度的数组10
vec2
不同长度的数组16
float
不同长度的数组32
vec4
/ vec3
/ vec2
/ float
个变量或数组的任何其他组合,最多使用32 float
s 因此,MAX_VARYING_VECTORS
的{{1}}值为15
,我想我最多可以使用float
秒。
我的测试似乎证实了这一点。
例如,30 vec2
个变换在我的计算机上正常工作,但31会导致"Varyings over maximum register limit"
链接错误。
所以我的问题是:
MAX_VARYING_VECTORS
是8
,那么使用16 vec2
种变体是否安全?这保证总是有效吗?答案 0 :(得分:8)
来自WebGL规范
6.24制服和不同的包装限制
OpenGL ES着色语言,版本1.00 [GLES20GLSL],附录A,第7节"变化和制服的计数"定义了一种保守算法,用于计算着色器中所有均匀变量和变量变量所需的存储空间。 GLSL ES规范要求如果附录A中定义的打包算法成功,则着色器必须在目标平台上成功编译。 WebGL API进一步要求,如果打包算法对着色器的统一变量或程序的变量变量失败,则编译或链接必须失败。
是的,如果您在MAX_VARYING_VECTORS
为8时阅读算法,则可以使用16 vec2
s。但是,您不能使用10 vec3
s。您只能使用8 vec3
s
还有数组限制。例如,如果float
为8,那么vec2
大于8的数组也不会大于MAX_VARYING_VECTORS
的数组。