2011-04-18 100 views
16

我正試圖圍繞浮點紋理包裹我的頭,但是我發現很難找到任何可以向我解釋的好資源..我嘗試閱讀OpenGL ARB_texture_float規範,但我仍然無法將它理解在我的腦海中。什麼是浮點紋理?

那麼浮點數據與我正在加載到紋理中的圖像中的正常8位每通道RGBA或RGB數據有什麼關係?

感謝您的幫助和任何與我的問題有關的信息!

回答

3

FP紋理有一個特殊的指定範圍的內部格式(RGBA_16F,RGBA_32F等)。 正則紋理存儲定點數據,因此讀取它們會給出[0,1]範圍值。相反,FP紋理爲您提供[-inf,+ inf]範圍(不一定具有更高的精度)。

在許多情況下(如HDR渲染),只需將值轉換爲適合[0,1]範圍,即可輕鬆進行FP紋理處理。但是,有些情況下,如您希望存儲的延遲渲染,例如世界空間座標而不關心它們的範圍。

+0

它們對於獲取着色器數據(例如isovalues)也很有用。 – pmr 2011-04-18 22:03:06

+0

那麼,您將如何去閱讀一個正常的RGB或RGBA 8位每通道圖像,以及這些值如何在內部解釋?例如將範圍從0-255或0-1範圍內的值縮放到其他範圍內? – lokstok 2011-04-19 14:14:20

+0

@lokstok。 glTexImage有一個參數叫做「normalized」。如果設置爲「true」,則輸入字節將在[0,1]範圍內轉換。否則,我想你會得到[0-255](我沒有嘗試)。 – kvark 2011-04-19 14:30:29

15

這是關於它的一點點閱讀here

基本上浮點紋理是一種紋理,其中數據是浮點類型:) 這是它不被鉗位。所以如果你的紋理中有3.14f,你會在着色器中讀取相同的值。

您可以使用不同數量的通道創建它們。您也可以根據格式打包16或32位紋理。例如

// create 32bit 4 component texture, each component has type float  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, data); 

,其中數據可能是這樣的:

float data[16][16]; 
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever 

然後在着色器,你可以得到完全相同(如果你使用FLOAT32紋理)值。

例如

uniform sampler2D myFloatTex; 
float value = texture2D(myFloatTex, texcoord.xy); 

如果您正在使用16位格式,說GL_RGBA16F,那麼當你在閱讀着色器,你將有一個皈依。所以,爲了避免這種情況,你可以使用half4類型: half4 value = texture2D(my16BitTex,texcoord.xy);

因此,基本上,歸一化的8位和浮點紋理之間的區別在於,第一種情況下,您的值將被調整到[0..1]範圍並被鉗位,而在後者中,您將按原樣接收您的值除了16 < - > 32轉換,請參閱上面的示例)。

並不是說你可能希望將它們與FBO一起用作渲染目標,在這種情況下,您需要知道並非所有格式都可以作爲渲染目標附加。例如。您無法附加亮度和強度格式。

並非所有硬件都支持浮點紋理的過濾,所以如果需要的話,您需要首先檢查它是否適合您的情況。

希望這會有所幫助。