Estoy escribiendo un sombreado GLSL vértice de un iMac con un procesador AMD Radeon HD 6970M tarjeta gráfica 2048 MB:¿Cuál es la cantidad real de componentes uniformes de vértice para el sombreador GLSL en la tarjeta gráfica ATI?
GL_MAX_VERTEX_ATTRIBS: 16
GL_MAX_VERTEX_UNIFORM_COMPONENTS: 4096
GL_VERSION: 2.1 ATI-7.12.9
GL_SHADING_LANGUAGE_VERSION: 1.20
En mi shader Me gustaría tener una gran variedad de uniformes mat4s:
uniform mat4 T[65]
pero si trato de tener 65 de estos, mi sombreador (secretamente) cambia al modo Procesador de software de Apple. Si en cambio uso 64:
uniform mat4 T[64]
todo está bien.
Parece ser un problema con exceder la cantidad máxima de uniformes. Pero, como he escrito anteriormente que estoy recibiendo de 4096 GL_MAX_VERTEX_UNIFORM_COMPONENTS modo 4096/(4 * 4) = 256 no 64 ...
OpenGL.org wiki dice
ATI/AMD Nota: Los valores de los componentes de ATI son máx incorrecto. Ellos son el número real de componentes dividido por 4.
Pero la lectura de este yo creo que si yo consulto GL_MAX_VERTEX_UNIFORM_COMPONENTS y obtener 4096 que en realidad tengo 16.384. Lo que parece ser el caso es que GL_MAX_VERTEX_UNIFORM_COMPONENTS devuelve el número real de componentes multiplican por 4. Esto luego daría 1024/(4 * 4) = 64.
¿Alguien puede confirmar esto?
Editar: Mi shader es simplemente:
#version 120
// 65 goes into software render mode
#define MAX_T 64
attribute vec4 indices;
uniform mat4 T[MAX_T];
void main()
{
gl_Position = T[int(indices[0])]*gl_Vertex;
}
Podría publicar su código de sombreado, o al menos la definición de todos los uniformes usados. Y tienes razón isofar, que necesitas dividir el 1024 por 4 sin multiplicar. La entrada de la wiki está mal redactada. – datenwolf
Publiqué el código de sombreado anterior (también me di cuenta de que antes tenía una en mi cuenta, así que edité los números en la pregunta original 63-> 64 y 64-> 65 en consecuencia). –
@datenwolf Debes publicar esto como una respuesta, ya que este parece ser su problema bastante obvio. Supongo que solo usa algunos otros uniformes pequeños que "bloquean" la cuadragésima cuadragésima ranura de la matriz (los uniformes integrados también cuentan, creo). –