I run
glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);
and get 1024.
Than in GLSL I do
uniform mediump vec4[1020] instance_mat
and that was ok. But with vec3/vec2/float it fails:
uniform mediump float[1030] instance_mat; // fails
//uniform mediump vec2[1030] instance_mat; // and this
//uniform mediump vec3[1030] instance_mat; // and this
With following error:
cannot locate suitable resource to bind variable "instance_mat". Possibly large array.
The question is: Does GL_MAX_VERTEX_UNIFORM_VECTORS return the number of all kind of arrays, no matter what size they are? I mean, no matter does this float/vec2/vec3/vec4 - all counts as one VERTEX_UNIFORM_VECTOR?
Vertex shader code, as is:
#version 120
uniform mediump float[1200] instance_mat; //mat4x3
attribute mediump float instaceIdF; // in range 0..1000 Will be converted to int
attribute mediump vec3 vertex_;
attribute lowp vec4 color;
uniform mediump mat4 matrix;
varying lowp vec4 v_color;
void main(void)
{
v_color = color;
int instaceId = int(instaceIdF) * 12;
mediump mat4 offsetMat = mat4(
vec4(instance_mat[instaceId], instance_mat[instaceId+1], instance_mat[instaceId+2], 0),
vec4(instance_mat[instaceId+3], instance_mat[instaceId+4], instance_mat[instaceId+5], 0),
vec4(instance_mat[instaceId+6], instance_mat[instaceId+7], instance_mat[instaceId+8], 0),
vec4(instance_mat[instaceId+9], instance_mat[instaceId+10], instance_mat[instaceId+11], 1)
);
/*mediump mat4 offsetMat = mat4(
vec4(instance_mat[instaceId].xyz, 0),
vec4(instance_mat[instaceId+1].xyz, 0),
vec4(instance_mat[instaceId+2].xyz, 0),
vec4(instance_mat[instaceId+3].xyz, 1)
);*/
gl_Position = matrix * offsetMat * vec4(vertex_, 1.0);
//gl_Position = matrix * vec4(vertex, 1.0);
}
GL_MAX_VERTEX_UNIFORM_VECTORS
refers to the sum total maximum size of all active uniforms in the vertex shader stage. If you have any other uniforms, the maximum length of an array you can support will be smaller. – Andon M. ColemanGL_MAX_VERTEX_UNIFORM_VECTORS
in GLSL 1.20. All you have isGL_MAX_VERTEX_UNIFORM_COMPONENTS
. In GLSL, this constant can be referenced by:gl_MaxVertexUniformComponents
and it has a minimum implementation limit of 512. You are consuming 1200 + 16 uniform components in your vertex shader (1200 for the array and 16 for the mat4). Try declaring something along the lines of:uniform mediump float instance_mat [gl_MaxVertexUniformComponents - 16];
– Andon M. Coleman