opengl - touchdesigner - GLSL float/vec3/vec4 array max size=GL_MAX_VERTEX_UNIFORM_VECTORS?
opengl shader descargar (2)
Corro
glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);
y obtén 1024
Que en GLSL lo hago
uniform mediump vec4[1020] instance_mat
y eso estuvo bien Pero con vec3 / vec2 / float falla:
uniform mediump float[1030] instance_mat; // fails
//uniform mediump vec2[1030] instance_mat; // and this
//uniform mediump vec3[1030] instance_mat; // and this
Con el siguiente error:
no se puede encontrar el recurso adecuado para vincular la variable "instancia_mat". Posiblemente una gran variedad.
La pregunta es: ¿GL_MAX_VERTEX_UNIFORM_VECTORS devuelve el número de todo tipo de matrices, independientemente de su tamaño? Quiero decir, no importa este float / vec2 / vec3 / vec4 - ¿todos cuentan como un VERTEX_UNIFORM_VECTOR?
Código de sombreado vértice, como es:
#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);
}
Los OpenGL Docs lo dicen todo.
GL_MAX_VERTEX_UNIFORM_VECTORS
datos devuelve un valor, la cantidad máxima de 4 vectores que pueden mantenerse en el almacenamiento de variables uniformes para el sombreador de vértices. El valor de GL_MAX_VERTEX_UNIFORM_VECTORS es igual al valor de GL_MAX_VERTEX_UNIFORM_COMPONENTS y debe ser al menos 256.
Por lo tanto, eso significa que no importa el tipo, solo puede contener una matriz de max GL_MAX_VERTEX_UNIFORM_VECTORS
de longitud. A pesar de que vec4 == 4 floats
El valor máximo del curso varía según las diferentes implementaciones rígidas y la antigüedad de la tarjeta gráfica individual de OpenGL.
Según http://www.opengl.org/wiki/Uniform_%28GLSL%29 (límites de implementación):
Nota de implementación: las implementaciones de OpenGL pueden rechazar sombreadores por motivos que dependen de la implementación. Por lo tanto, puede tener menos componentes de uniforme activo según sus cálculos y aún así no puede vincular debido a los límites uniformes. Esto es usualmente en hardware que es innatamente hardware de vector. El hardware Pre-GeForce 8xxx y todos los hardware ATi lo hacen. En este caso, debe suponer que cada uniforme por separado ocupa 4 componentes, como lo haría en D3D. Eso significa que un "flotador uniforme" es de 4 componentes , un mat2x4 tiene 16 componentes (cada fila es de 4 componentes), pero un mat4x2 tiene 8 componentes.
Cuál es mi caso, también. Pero no tiene que ser siempre así. Por supuesto, por razones compatibles siempre es mejor contar cada valor uniforme de float / vec2 / vec3, como valor máximo de tamaño (vec4)