2015-02-06 192 views
2

我正在用C++編程OpenGL渲染器。我希望它儘可能高效,並且每個頂點/普通/ UV tex座標/切線/等都要佔用盡可能少的內存。我正在使用索引,線條和粉絲。我認爲32位浮點數不是必須的,16位浮點數應該沒問題,至少對於像法線和UV這樣的一些浮點。我似乎無法在任何地方找到任何這方面的例子。我可以找到關於「GL_HALF_FLOAT」的討論,但沒有真正的例子。我在正確的軌道上嗎?或者這不值得尋找?如果有人知道這樣的例子,他們可以發送一個源代碼的鏈接?「GL_HALF_FLOAT」使用OpenGL渲染和GLSL

+1

可以使用'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

+0

@ AndonM.Coleman您可以在頂點緩衝區中使用'HALF_FLOAT'數據。當它到達着色器時,它當然會擴展到32位精度,但如果半浮點數對於座標具有足夠的精度,則仍可節省存儲空間和帶寬。 – 2015-02-06 04:49:32

+0

@ReetoKoradi:我完全誤解了這個問題,因爲我的思想是在其他地方: - 我有點看到了標籤,並認爲他想改變GLSL中'float'的精度。是的,你完全正確 - 儘管因爲半浮點數不是大多數語言的一部分,所以像glm(假設這是C++)將不得不填充該角色。 – 2015-02-06 05:04:48

回答

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的轉換,要麼使用其他人編寫的代碼。

以下有關半浮點轉換的資源來自快速搜索。我與任何人沒有親身經歷,你應該做你自己的搜索,找到一個最適合你的需求: