我試圖將我的程序從GLfloat轉換爲GLshort作爲頂點位置,我不知道如何在着色器中表示這個。我在着色器中使用了vec3數據類型,但vec3表示3個浮點數。現在我需要代表3條短褲。據我所知,OpenGL沒有用於短褲的矢量,所以在這種情況下我該怎麼做?使用GLshort而不是GLfloat作爲頂點
6
A
回答
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],作爲浮點範圍。
只有在使用glVertexAttribIPointer
或glVertexAttribLPointer
時,用於屬性的GLSL類型纔會發生更改,兩者都不可用於OpenGL ES 2.0。
總之:你應該總是使用浮動GLSL類型的屬性。 OpenGL將爲你做轉換。
相關問題
- 1. 頂點屬性 - 使用短而不是浮點的頂點位置
- 2. 我有一個問題,使用GLshort來表示頂點,和正常
- 3. 將GLfloat []數組轉換爲GLfloat * array
- 4. glVertexAttribPointer:繪製法線而不是頂點
- 5. 爲什麼使用VBO和/或IBO而不是簡單的頂點數據?
- 6. 傳遞GLfloat作爲均勻失敗(IOS)
- 7. GLubyte vs GLshort for Indices
- 8. Jquery - 點擊頂部頂層上的點擊事件,而不是兩個
- 9. RelativeLayout而不是頂部
- 10. 使用ddply,而不是爲
- 11. 使用變量作爲值而不是作爲參考
- 12. 使用f:attribute作爲commandButton而不是f:param作爲h:commandLink
- 13. 使用控制器作爲語法而不是$ scope的優點是什麼?
- 14. 爲什麼IPv6使用冒號作爲分隔符而不是點?
- 15. 爲什麼GLint和GLfloat?
- 16. 頂點不工作的webserver
- 17. 爲什麼我們不使用<h>作爲超鏈接而不是<a>作爲錨點?
- 18. 如何循環遍歷圖的頂點而不是爲每個頂點分別添加add.vertex?
- 19. 使用方塊而不是點
- 20. 使用處理器而不是端點
- 21. 使用NodeJS而不是PHP的缺點
- 22. Opengl - GLfloat不被識別
- 23. 訪問邊而不迭代頂點
- 24. jQuery FadeOut()不起作用。點擊只是跳躍而不是
- 25. 默認情況下是GLfloat還是GLdouble?
- 26. 爲什麼使用write_lock_irq而不是write_lock作爲tasklist_lock?
- 27. 爲什麼Qt使用reinterpret_cast而不是static_cast作爲void *?
- 28. 爲什麼使用'op_Addition'作爲運算符'+'而不是名稱'+'?
- 29. 爲什麼Microsoft使用14.667而不是14作爲ControlContentThemeFontSize?
- 30. 按鈕點擊方法滾動到頁面頂部,而不是執行動作
我的印象是,我可以在閱讀答案後:http://stackoverflow.com/a/1316494/256062和http://stackoverflow.com/a/5721102/256062 – Xavier 2012-07-26 22:41:44
@Xavier:你是錯過了這一點。頂點數據的大小由'glVertexAttribPointer'定義,*不是* GLSL屬性變量。您不需要*在着色器中表示較小的組件;硬件將*從較小的組件轉換成較大的組件。 – 2012-07-26 23:09:21
@ 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