tutorial touchdesigner shadertoy shaders descargar opengl glsl

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)