2011-04-18 61 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一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以作为渲染目标附加。例如。您无法附加亮度和强度格式。

并非所有硬件都支持浮点纹理的过滤,所以如果需要的话,您需要首先检查它是否适合您的情况。

希望这会有所帮助。