2011-12-21 8 views
10

Sto scrivendo uno shader GLSL vertice per un iMac con un'AMD Radeon HD 6970M scheda grafica 2048 MB:Qual è il numero effettivo di componenti di vertice per lo shader GLSL sulla scheda grafica 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 

Nel mio Shader vorrei avere una vasta gamma di mat4s uniformi:

uniform mat4 T[65] 

ma se provo ad avere 65 di questi il ​​mio shader (segretamente) passa alla modalità Renderer Software Apple. Se invece uso 64:

uniform mat4 T[64] 

tutto va bene.

Sembra essere un problema con il superamento del numero massimo di uniformi. Ma, come ho scritto sopra mi sto 4096 per GL_MAX_VERTEX_UNIFORM_COMPONENTS modo 4096/(4 * 4) = 256, non 64 ...

OpenGL.org wiki dice

ATI/AMD nota: I valori dei componenti max ATI sono sbagliato. Sono il numero effettivo dei componenti diviso per 4.

Ma la lettura di questo mi potrebbe pensare che se interrogo GL_MAX_VERTEX_UNIFORM_COMPONENTS e ottenere 4096 che io in realtà sono 16.384. Quello che sembra essere il caso è che GL_MAX_VERTEX_UNIFORM_COMPONENTS restituisce il numero effettivo dei componenti moltiplicati per 4. Questo sarebbe poi dare 1024/(4 * 4) = 64.

Qualcuno può confermare?

Edit: mio Shader è semplicemente:

#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; 
} 
+3

Potrebbe postare il codice dello shader o almeno la definizione di tutte le uniformi utilizzate. E hai ragione isofar, che devi dividere il 1024 per 4 non moltiplicare. La voce wiki è formulata male. – datenwolf

+0

Ho pubblicato il codice dello shader sopra (ho anche notato che prima di averne uno spento nel mio conteggio, così ho modificato i numeri nella domanda originale 63-> 64 e 64-> 65 di conseguenza). –

+1

@datenwolf Si dovrebbe postare questo come una risposta, in quanto questo sembra essere il suo problema abbastanza ovviamente. Immagino che usi solo altre piccole uniformi che "bloccano" l'ultimo 64 ° slot della matrice (anche le uniformi integrate contano, penso). –

risposta

7

Hai ragione isofar, che è necessario dividere il 4096 dal 4 non moltiplicarsi. La voce wiki è formulata male.

+5

Non è * formulato male; guarda di nuovo. E non guardare nemmeno la cronologia delle modifiche su quella pagina; Sono sicuro che la persona che l'ha scritta certamente non l'ha corretto dopo aver visto questo Q/A. No, certo non è successo qualche minuto fa. ;) –

Problemi correlati