什么是浮点纹理?

lok*_*tok 17 opengl floating-point textures

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

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

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

ala*_*riq 17

这里是一个读一点点在这里了.

基本上浮点纹理是一种纹理,其中数据是浮点类型:)即它没有被钳制.因此,如果纹理中有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);
Run Code Online (Sandbox Code Playgroud)

数据可能是这样的:

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

然后在着色器中你可以得到完全相同的(如果你使用FLOAT32纹理)值.

例如

uniform sampler2D myFloatTex;
float value = texture2D(myFloatTex, texcoord.xy);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

希望这可以帮助.


kva*_*ark 4

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

在许多情况下(例如 HDR 渲染),您可以轻松地在没有 FP 纹理的情况下继续操作,只需将值转换为适合 [0,1] 范围即可。但是,在某些情况下,例如当您可能想要存储世界空间坐标而不关心它们的范围时,会出现延迟渲染之类的情况。