2012-07-26 12 views
6

Sto tentando di convertire il mio programma da GLfloat a GLshort per le posizioni dei vertici e non sono sicuro di come rappresentarlo nello shader. Stavo usando un tipo di dati vec3 nello shader ma vec3 rappresenta 3 float. Ora ho bisogno di rappresentare 3 cortometraggi. Per quanto posso dire, OpenGL non ha un vettore per i cortometraggi, quindi cosa dovrei fare in questo caso?Uso di GLshort invece di GLfloat per i vertici

risposta

16

Non sono sicuro di come rappresentare questo nello shader.

Questo perché queste informazioni non vivono nello shader.

Tutti i valori forniti da glVertexAttribPointer sarà convertiti in valori GLSL virgola mobile (se non sono già galleggia). Questa conversione è essenzialmente gratuita. Così si può utilizzare uno di questi glVertexAttribPointer definizioni con un tipo di attributo vec4:

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...); 
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...); 
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...); 
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...); 

Tutti questi sarà convertito in un vec4automaticamente. Il tuo shader non deve sapere né preoccuparsi che venga alimentato con corti, byte, numeri interi, galleggianti, ecc.

Il primo verrà utilizzato così com'è. Il secondo convertirà il corto raggio senza segno [0, 65535] nell'intervallo a virgola mobile [0,0, 1,0]. Il terzo convertirà la gamma breve firmata [-32768, 32767] nell'intervallo [-1,0, 1,0] (though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0). Il quarto convertirà [-32768, 32767] in [-32768.0, 32767.0], come un intervallo in virgola mobile.

Il tipo di GLSL che si utilizza per gli attributi cambia solo se si utilizza glVertexAttribIPointer o glVertexAttribLPointer, nessuno dei quali è disponibile in OpenGL ES 2.0.

In breve: è necessario utilizzare sempre i tipi GLSL float per gli attributi. OpenGL farà la conversione per te.

+0

Ho avuto l'impressione che potevo dopo aver letto le risposte all'indirizzo: http://stackoverflow.com/a/1316494/256062 e http://stackoverflow.com/a/5721102/256062 – Xavier

+0

@Xavier: sei manca il punto. La dimensione dei dati del vertice è definita da 'glVertexAttribPointer', * not * la variabile di attributo GLSL. Non * è necessario * per rappresentare componenti più piccoli nello shader; l'hardware * convertirà * da componenti più piccoli a quelli più grandi. –

+0

@ nicol-bolas Per i tipi di dati firmati, sei sicuro che l'intervallo convertito sia ad esempio (per 'short')' [-32768, 32767] 'e non' [-32767, 32767] '? Questo [articolo] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), apparentemente tratto dal Libro arancione, sembra insegnare in modo diverso. Dice che la conversione è solo una divisione per i tipi firmati. In tal caso, il valore breve '-32768' verrebbe convertito in valore GLSL a virgola mobile' -32768/32767 = -1.000305185..'. Non riesco a trovare nelle specifiche dove determinare quale sia corretta. – wil

Problemi correlati