什么是浮点纹理?

时间:2011-04-18 21:17:00

标签: opengl floating-point textures

我试图将我的头部包裹在浮点纹理周围,但我发现很难找到任何可以向我解释它们的好资源..我试过阅读OpenGL ARB_texture_float规范,但我仍然无法理解它..

浮点数据如何与我正在加载到纹理中的图像中的每个通道的正常8位RGBA或RGB数据相关?

感谢您提供帮助以及与我的问题相关的任何信息!!

2 个答案:

答案 0 :(得分:15)

以下是关于它的一点点here

基本上浮点纹理是一种纹理,其中数据是浮点类型:) 那就是它没有被钳制。因此,如果纹理中有3.14f,则将在着色器中读取相同的值。

您可以使用不同数量的频道创建它们。您也可以根据格式创建16位或32位纹理。 e.g。

// 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纹理)值。

e.g。

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

如果你使用16位格式,比如说GL_RGBA16F,那么每当你在着色器中阅读时,你都会有一个转换。所以,为了避免这种情况,你可以使用half4类型:     half4 value = texture2D(my16BitTex,texcoord.xy);

因此,基本上,归一化的8位和浮点纹理之间的区别在于,在第一种情况下,您的值将被带到[0..1]范围并被钳制,而在后者中,您将按原样接收您的值(除了对于16&lt; - &gt; 32转换,请参阅上面的示例。)

并不是说您可能希望将它们与FBO一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以作为渲染目标附加。例如。你不能附上亮度和强度格式。

此外,并非所有硬件都支持浮点纹理的过滤,因此如果需要,您需要首先检查它。

希望这有帮助。

答案 1 :(得分:3)

FP纹理具有特殊指定范围的内部格式(RGBA_16F,RGBA_32F等)。 常规纹理存储定点数据,因此从它们读取会给出[0,1]范围值。相反,FP纹理会给你[-inf,+ inf]范围(不一定具有更高的精度)。

在许多情况下(如HDR渲染),您可以轻松地在没有FP纹理的情况下继续进行,只需将值转换为适合[0,1]范围即可。但是,如果您想要存储世界空间坐标而不关心它们的范围,则会出现像延迟渲染这样的情况。