2012-07-26 12 views
6

我試圖將我的程序從GLfloat轉換爲GLshort作爲頂點位置,我不知道如何在着色器中表示這個。我在着色器中使用了vec3數據類型,但vec3表示3個浮點數。現在我需要代表3條短褲。據我所知,OpenGL沒有用於短褲的矢量,所以在這種情況下我該怎麼做?使用GLshort而不是GLfloat作爲頂點

回答

16

我不知道如何在着色器中表示這個。

這是因爲這些信息並不在着色器中。

glVertexAttribPointer提供的所有值將爲轉換爲浮點GLSL值(如果它們不是浮點型的)。這種轉換基本上是免費的。所以,你可以使用這些glVertexAttribPointer定義與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, ...); 

所有這些都將被轉換成vec4自動。你的着色器並不需要知道或關心它是否被短褲,字節,整數,浮動等等。

第一個將按原樣使用。第二個將無符號短範圍[0,65535]轉換爲[0.0,1.0]浮點範圍。第三個將把有符號的短程範圍[-32768,32767]轉換爲[-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)。第四個將把[-32768,32767]轉換爲[-32768.0,32767.0],作爲浮點範圍。

只有在使用glVertexAttribIPointerglVertexAttribLPointer時,用於屬性的GLSL類型纔會發生更改,兩者都不可用於OpenGL ES 2.0。

總之:你應該總是使用浮動GLSL類型的屬性。 OpenGL將爲你做轉換。

+0

我的印象是,我可以在閱讀答案後:http://stackoverflow.com/a/1316494/256062和http://stackoverflow.com/a/5721102/256062 – Xavier 2012-07-26 22:41:44

+0

@Xavier:你是錯過了這一點。頂點數據的大小由'glVertexAttribPointer'定義,*不是* GLSL屬性變量。您不需要*在着色器中表示較小的組件;硬件將*從較小的組件轉換成較大的組件。 – 2012-07-26 23:09:21

+0

@ nicol-bolas對於有符號數據類型,你確定轉換後的範圍是(例如'short')'[-32768,32767]'而不是'[-32767,32767]'?這篇文章(http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3),據推測來自橙皮書,似乎教導不同。它表示轉換隻是簽名類型的一個部門。在這種情況下,短值「-32768」將被轉換爲浮點GLSL值「-32768/32767 = -1.000305185..」。我無法在規範中找到哪裏確定哪個是正確的。 – wil 2014-04-18 06:06:47

相關問題