2011-07-08 18 views
2

我很困惑OpenGL如何存儲單個組件紋理(如GL_RED)。OpenGL如何轉換單個組件紋理?

GL將它轉換爲浮點,並通過將綠色和藍色連接爲0,並將Alpha連接到1將其組裝到RGBA元素中。

這是否意味着我的紋理將在圖形內存中佔用32 bpp,即使我只給出8 bpp?

另外我想知道OpenGL如何將字節轉換爲浮點以便在着色器中進行操作。這似乎是合乎邏輯的簡單地除以255 ..

回答

4

你不知道,你沒有辦法知道(好吧好吧,我有點說謊...有存在documentation它告訴你那些細節一些特定的硬件,但是一般你沒有辦法知道,因爲你事先不知道你的程序將運行在什麼硬件上)。

OpenGL根據您的請求存儲紋理有點,但它最終選擇了硬件支持的東西。如果這意味着它將您的輸入數據轉換爲完全不同的東西,它就會默默地進行。

例如,大多數實現將RGB轉換爲RGBA,因爲這對於內存訪問更方便。 5-5-5數據轉換爲8-8-8和類似數據也是如此。

通常情況下,8bpp紋理現在每個像素只需要1個字節(因爲幾乎所有的卡都支持該功能,而對於軟件實現則無關緊要),儘管這不是100%可以依賴的。你不應該擔心,但是...它會確保它以某種方式工作。

順便說一下,類似的情況也可能發生在非二次冪的紋理上。在所有現代版本的OpenGL中,都支持這種方式(如果我沒有記錯的話,從2.0開始)。儘管至少在理論上,一些較舊的卡片可能不支持此功能。
在這種情況下,OpenGL會默默地使紋理成爲下一個更大的二次冪,並且只使用它的一部分(不會告訴你!)。

+0

感謝您的回覆。你知道當你在着色器中使用它們時,OpenGL如何將8位顏色值轉換爲浮點數? – Jonathan

+0

從概念上講,簡單地除以255 ......但我不知道是否有_actually_正在進行分區或查找表。看到一個256條目查找表是如何廉價和劃分是昂貴的,我會假設查找表。伽馬校正通常也適用於查找表,而不是真的使用'pow'。 – Damon

+0

好的,謝謝!我認爲這可能是通過加上一個除以256,因爲除以255 =精確度損失。 – Jonathan