2013-01-10 16 views
0

我想在GLSL中繪製一些深度圖的國王,我至少需要一個10bit通道。我決定使用GL_R16或GL_RGBA12 - 他們是最近的一個,並且GL_R16將花費更少的gpu內存(因爲它會對..)。如何在GLSL中使用RGBA16?

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA12, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 

問題出在這裏:如何讓GLSL正確使用它? Sampler2D將其轉換爲經典的8位RGBA ... 夾緊情況如何?在GLSL中,每個組件的顏色被歸一化爲[0,1] - 對於16位它是相同的嗎? 我只想知道如何使用它。

+0

您定位的是什麼GLSL'#version'? – genpfault

+0

120 ..很不幸 – Krzycho

+0

*「Sampler2D將其轉換爲經典的8位RGBA」* - 我很確定它沒有。最後,你從'texture2D'得到的是一個'float'。 –

回答

4

Sampler2D把它轉換成經典的8位RGBA ...

不,不。一個sampler2d不知道或關心的格式(除非它是一個整數格式,在這種情況下,你會得到未定義的行爲)。它將它轉換成一個浮點數;而已。

夾緊怎麼辦?

夾緊是無關緊要的,因爲GL_RGBA16是一個無符號的歸一化格式。就像GL_RGBA8將[0,255]轉換爲[0,1]一樣,範圍[0,65535]上的整數值被轉換爲[0,1]。這不是「夾緊」;這就是你的格式所說的OpenGL的功能。較高精度的格式只能提供更好的精度;他們不提供更大的數字。

如果你想真正得到的16位整數作爲整數,那麼你需要使用實際存儲整數的格式。 GL_RGBA16UI存儲16位無符號整數。當然,這需要OpneGL 3.x +硬件。你必須使用usampler2d

+0

那麼......這是好消息=] - 但這意味着我的問題是在那個格式轉換的其他地方...反正你給了我一些非常有用的信息在這裏。謝謝你。不幸的是,我使用SDL 1.2,所以我不能高於OGL 2.但是我能做的總是「非規範化」回到[0,65535]範圍;)我不會那麼高效和精確,但似乎對我來說,我有雙手綁在一起。 – Krzycho