2012-07-26 4 views
6

Ich versuche, mein Programm von GLfloat in GLshort für Vertexpositionen zu konvertieren, und ich bin mir nicht sicher, wie dies im Shader darzustellen ist. Ich benutzte einen Vec3-Datentyp im Shader, aber Vec3 repräsentiert 3 Floats. Jetzt muss ich 3 Shorts darstellen. Soweit ich weiß, hat OpenGL keinen Vektor für Shorts, also was soll ich in diesem Fall tun?Verwenden von GLshort anstelle von GLfloat für Scheitelpunkte

Antwort

16

Ich bin mir nicht sicher, wie dies im Shader darzustellen ist.

Das liegt daran, dass diese Informationen nicht im Shader leben.

Alle Werte, die von glVertexAttribPointer bereitgestellt werden, werden konvertiert zu Floating-Point-GLSL-Werten (wenn sie nicht bereits Floats sind). Diese Umwandlung ist im Wesentlichen frei. So können Sie mit einem vec4 Attributtyp jeder dieser glVertexAttribPointer Definitionen verwenden:

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, ...); 

All dies wird in einem vec4automatisch umgewandelt werden. Ihr Shader muss nicht wissen oder sich darum kümmern, dass er mit Kurzschlüssen, Bytes, Ganzzahlen, Schwimmern usw. gespeist wird.

Der erste wird unverändert verwendet. Die zweite konvertiert den vorzeichenlosen kurzen Bereich [0, 65535] in den Gleitkommabereich [0.0, 1.0]. Die dritte konvertiert den vorzeichenbehafteten Bereich [-32768, 32767] in den Bereich [-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). Der vierte konvertiert [-32768, 32767] in [-32768.0, 32767.0] als Gleitkommabereich. Der GLSL-Typ, den Sie für Attribute verwenden, wird nur geändert, wenn Sie glVertexAttribIPointer oder glVertexAttribLPointer verwenden, von denen keiner in OpenGL ES 2.0 verfügbar ist.

Kurz gesagt: Sie sollten immer float GLSL-Typen für Attribute verwenden. OpenGL übernimmt die Konvertierung für Sie.

+0

Ich war unter dem Eindruck, ich könnte nach dem Lesen der Antworten auf: http://Stackoverflow.com/a/1316494/256062 und http://Stackoverflow.com/a/5721102/256062 – Xavier

+0

@ Xavier: Du bist am Thema vorbei. Die Größe Ihrer Vertex-Daten wird durch 'glVertexAttribPointer' definiert, * nicht * die GLSL-Attributvariable. Du brauchst * keine * kleineren Komponenten im Shader darzustellen; Die Hardware wird * von kleineren Komponenten in größere konvertieren. –

+0

@ nicol-bolas Für signierte Datentypen, sind Sie sicher, dass der konvertierte Bereich zum Beispiel (für 'short')' [-32768, 32767] 'und nicht' [-32767, 32767] '' ist? Dieser [Artikel] (http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3), angeblich aus dem Orange Book entnommen, scheint anders zu lehren. Es besagt, dass die Konvertierung nur eine Unterteilung für signierte Typen ist. In diesem Fall würde der Kurzwert "-32768" in den Gleitkomma-GLSL-Wert "-32768/32767 = -1.000305185.." umgewandelt werden. Ich kann nicht in der Spezifikation finden, wo zu bestimmen, was richtig ist. – wil

Verwandte Themen