2012-07-26 6 views
6

Estoy intentando convertir mi programa de GLfloat a GLshort para las posiciones de los vértices y no estoy seguro de cómo representar esto en el sombreador. Estaba usando un tipo de datos vec3 en el sombreador pero vec3 representa 3 flotadores. Ahora necesito representar 3 cortos. Por lo que puedo decir, OpenGL no tiene un vector para los pantalones cortos, entonces, ¿qué se supone que debo hacer en este caso?Uso de GLshort en lugar de GLfloat para los vértices

Respuesta

16

No estoy seguro de cómo representar esto en el sombreado.

Esto se debe a que esta información no se encuentra en el sombreado.

Todos los valores proporcionados por glVertexAttribPointer serán convertidos en valores GLSL de punto flotante (si no son flotadores ya). Esta conversión es esencialmente gratis. Así que usted puede utilizar cualquiera de estas definiciones glVertexAttribPointer con un tipo de atributo 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, ...); 

Todo esto se convertirá en una vec4 automáticamente. Su sombreador no tiene que saber o preocuparse de que se lo esté alimentando con pantalones cortos, bytes, enteros, flotadores, etc.

El primero se usará como está. El segundo convertirá el rango corto sin signo [0, 65535] al rango de punto flotante [0.0, 1.0]. El tercero convertirá el rango corto firmado [-32768, 32767] al rango [-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). El cuarto convertirá [-32768, 32767] a [-32768.0, 32767.0], como un rango de coma flotante.

El tipo GLSL que utiliza para los atributos solo cambia si usa glVertexAttribIPointer o glVertexAttribLPointer, ninguno de los cuales está disponible en OpenGL ES 2.0.

En resumen: siempre debe usar los tipos de GLSL flotantes para los atributos. OpenGL hará la conversión por usted.

+0

Tenía la impresión de que podía después de leer las respuestas en: http://stackoverflow.com/a/1316494/256062 y http://stackoverflow.com/a/5721102/256062 – Xavier

+0

@Xavier: Estás perdiendo el punto. El tamaño de sus datos de vértice está definido por 'glVertexAttribPointer', * not * la variable de atributo GLSL. No * necesita * para representar componentes más pequeños en el sombreador; el hardware * convertirá * de componentes más pequeños a componentes más grandes. –

+0

@ nicol-bolas Para tipos de datos con signo, ¿está seguro de que el rango convertido es, por ejemplo (para 'short')' [-32768, 32767] 'y no' [-32767, 32767] '? Este [artículo] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), supuestamente tomado del Orange Book, parece enseñar de manera diferente. Dice que la conversión es solo una división para tipos firmados. En ese caso, el valor corto '-32768' se convertiría a un valor GLSL de coma flotante' -32768/32767 = -1.000305185..'. No puedo encontrar en la especificación dónde determinar cuál es la correcta. – wil

Cuestiones relacionadas