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一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以作为渲染目标附加.例如,您无法附加亮度和强度格式.
此外,并非所有硬件都支持浮点纹理的过滤,因此如果需要,您需要首先检查它.
希望这可以帮助.
FP 纹理具有特殊指定的内部格式范围(RGBA_16F、RGBA_32F 等)。常规纹理存储定点数据,因此读取它们会给出 [0,1] 范围值。相反,FP 纹理会为您提供 [-inf,+inf] 范围(不一定具有更高的精度)。
在许多情况下(例如 HDR 渲染),您可以轻松地在没有 FP 纹理的情况下继续操作,只需将值转换为适合 [0,1] 范围即可。但是,在某些情况下,例如当您可能想要存储世界空间坐标而不关心它们的范围时,会出现延迟渲染之类的情况。