我正在用C++編程OpenGL渲染器。我希望它儘可能高效,並且每個頂點/普通/ UV tex座標/切線/等都要佔用盡可能少的內存。我正在使用索引,線條和粉絲。我認爲32位浮點數不是必須的,16位浮點數應該沒問題,至少對於像法線和UV這樣的一些浮點。我似乎無法在任何地方找到任何這方面的例子。我可以找到關於「GL_HALF_FLOAT」的討論,但沒有真正的例子。我在正確的軌道上嗎?或者這不值得尋找?如果有人知道這樣的例子,他們可以發送一個源代碼的鏈接?「GL_HALF_FLOAT」使用OpenGL渲染和GLSL
2
A
回答
4
在完整的OpenGL中(與OpenGL ES不同),着色器代碼始終使用32位浮點運算。不過,從OpenGL 3.0開始,支持將頂點數據指定爲半浮點數。如果精度足夠滿足您的需求,這可以減少頂點數據的內存使用量,並減少頂點提取所需的帶寬。
請記住,半浮點的精度只有約3-4個十進制數字。所以準確度真的非常有限。
至於如何使用它們,這是非常簡單的。如果您有指向半浮點值的指針,則使用glBufferData()
或glBufferSubData()
將它們存儲在VBO中,就像您對其他類型的值一樣。然後,glVertexAttribPointer()
呼叫看起來像這樣,使用具有3個分量的屬性,例如:
glVertexAttribPointer(loc, 3, GL_HALF_FLOAT, GL_FALSE, 0);
數據本身的格式在ARB_texture_float擴展中定義。雖然它沒有正式命名,但它至少非常類似於IEEE 754-2008格式。我之前編寫了基於Wikipedia格式描述的轉換代碼,並且它對OpenGL的使用效果很好。
大多數語言都沒有內置的半浮點類型。所以你要麼寫幾行代碼來完成從float到half-float的轉換,要麼使用其他人編寫的代碼。
以下有關半浮點轉換的資源來自快速搜索。我與任何人沒有親身經歷,你應該做你自己的搜索,找到一個最適合你的需求:
- 從英特爾有趣的文章,解釋可能的性能優勢:https://software.intel.com/en-us/articles/performance-benefits-of-half-precision-floats。這也提到英特爾處理器有轉換的指令(例如有一個內部的
_mm256_cvtps_ph
從float轉換爲half-float)。 - 用於半浮點操作和轉換的開源庫:http://half.sourceforge.net/。
- gcc文檔說它支持ARM目標的半浮點類型(
__fp16
)。
相關問題
- 1. 渲染到QOpenGLFramebufferObject GL_HALF_FLOAT
- 2. 在OpenGL和GLSL中的點渲染
- 3. 渲染使用OpenGL
- 4. OpenGL渲染不使用OpenCV的GLSL着色器
- 5. 使用OpenGL渲染錯誤
- 6. 使用Freetype和OpenGL渲染字體
- 7. 使用GLSL framebuffer渲染時出錯
- 8. 渲染SVG支持OpenGL(和OpenGL ES)
- 9. OpenGL渲染故障
- 10. Opengl渲染順序
- 11. OpenGL全屏渲染
- 12. OpenGL停止渲染
- 13. OpenGL渲染紋理
- 14. 如何使用OpenGL ES渲染圖像?
- 15. 使用webgl/opengl進行輪廓渲染
- 16. OpenGL:僅使用GL_POINTS渲染線條
- 17. OpenGL保存渲染供以後使用
- 18. Android:使用NDK進行OpenGL渲染
- 19. Win32 API渲染線程和OpenGL
- 20. Qt和OpenGL如何渲染PVR
- 21. QT Webkit和OpenGL渲染上下文
- 22. 結合畫布和OpenGL ES渲染器?
- 23. onDrawFrame,requestRender和渲染線程? | OpenGL ES 2.0
- 24. OpenGL Viewer控制和渲染上下文
- 25. C#OpenTK GLSL嘗試渲染時崩潰
- 26. opengl關閉屏幕渲染
- 27. OpenGL L系統渲染
- 28. OpenGL奇怪的渲染
- 29. OpenGL ES渲染到紋理
- 30. android opengl渲染垃圾
可以使用'uint'數據類型打包和解壓縮2個半浮點數。但是您將要在GLSL中獲得的最小數據類型是32位。有關更多詳細信息,請參閱['uint packHalf2x16(\t vec2 v)'](https://www.opengl.org/sdk/docs/man4/html/packHalf2x16.xhtml)。 – 2015-02-06 04:32:59
@ AndonM.Coleman您可以在頂點緩衝區中使用'HALF_FLOAT'數據。當它到達着色器時,它當然會擴展到32位精度,但如果半浮點數對於座標具有足夠的精度,則仍可節省存儲空間和帶寬。 – 2015-02-06 04:49:32
@ReetoKoradi:我完全誤解了這個問題,因爲我的思想是在其他地方: - 我有點看到了標籤,並認爲他想改變GLSL中'float'的精度。是的,你完全正確 - 儘管因爲半浮點數不是大多數語言的一部分,所以像glm(假設這是C++)將不得不填充該角色。 – 2015-02-06 05:04:48