From the OpenGL ES spec section 2.10.4 (Shader Variables: Varying Variables):
The number of interpolators available for processing varying variables is given by the implementation-dependent constant MAX_VARYING_VECTORS
.
This value represents the number of four-element floating-point vectors that can be interpolated; varying variables declared as matrices or arrays will consume multiple interpolators.
When a program is linked, any varying variable written by a vertex shader, or read by a fragment shader, will count against this limit.
A program whose shaders access more than MAX_VARYING_VECTORS
worth of varying variables may fail to link
In Chrome on my machine, gl.getParameter(gl.MAX_VARYING_VECTORS)
returns 15
, which means I can use 15 vec4
varyings in a shader.
I've verified this with a few tests. 15 vec4
varyings work OK, but when attempting to use 16, the program fails to link and gl.getProgramInfoLog()
returns "Varyings over maximum register limit"
.
But how many varyings of type vec3
, vec2
or float
can be used?
The OpenGL ES spec seems to hint at this, without being explicit:
any varying variable ... will count against this limit.
A program whose shaders access more than MAX_VARYING_VECTORS
worth of varying variables may fail to link
I'm making two guesses:
- The maximum number of varying
float
s is given by:
MAX_VARYING_VECTORS * 4
(4 float
s per vec4
vector)
- If (for example)
MAX_VARYING_VECTORS
is 8
, then each of the following can safely be used without causing any linking errors:
- 8
vec4
varyings
- 10
vec3
varyings
- 16
vec2
varyings
- 32
float
varyings
- 3
vec4
, 3 vec3
, 3 vec2
and 5 float
varyings
- 1
vec4
varying array of length 8
- 1
vec3
varying array of length 10
- 1
vec2
varying array of length 16
- 1
float
varying array of length 32
- Any other combination of
vec4
/ vec3
/ vec2
/ float
variables or arrays, which uses a maximum of 32 float
s
So with my MAX_VARYING_VECTORS
value of 15
, I guess I can use a maximum of 60 float
s.
My tests seem to confirm this.
For example, 30 vec2
varyings work OK on my machine, but 31 causes a "Varyings over maximum register limit"
linking error.
So my questions are:
- Are my two guesses correct?
- If
MAX_VARYING_VECTORS
is 8
, then is it safe to use 16 vec2
varyings? Is this guaranteed to always work?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…