【发布时间】:2011-04-18 21:16:59
【问题描述】:
我尝试阅读 OpenGL ARB_texture_float 规范,但我仍然无法理解它..
浮点数据与我加载到纹理中的图像中的普通 8 位每通道 RGBA 或 RGB 数据有何关系?
【问题讨论】:
标签: opengl floating-point textures
我尝试阅读 OpenGL ARB_texture_float 规范,但我仍然无法理解它..
浮点数据与我加载到纹理中的图像中的普通 8 位每通道 RGBA 或 RGB 数据有何关系?
【问题讨论】:
标签: opengl floating-point textures
这里是关于它的一点点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 值 = texture2D(my16BitTex, texcoord.xy);
因此,基本上,标准化 8 位纹理和浮点纹理之间的区别在于,在第一种情况下,您的值将被带到 [0..1] 范围并被钳制,而在后者中,您将按原样接收您的值(除了对于 1632 转换,请参见我上面的示例)。
并不是说您可能希望将它们与 FBO 一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以附加为渲染目标。例如。您不能附加亮度和强度格式。
此外,并非所有硬件都支持浮点纹理过滤,因此如果需要,您需要先检查一下。
希望这会有所帮助。
【讨论】:
FP 纹理具有特殊指定的内部格式范围(RGBA_16F、RGBA_32F 等)。 常规纹理存储定点数据,因此从它们中读取会为您提供 [0,1] 范围值。相反,FP 纹理会因此为您提供 [-inf,+inf] 范围(不一定具有更高的精度)。
在许多情况下(例如 HDR 渲染),您可以在没有 FP 纹理的情况下轻松进行,只需将值转换为适合 [0,1] 范围。但是在某些情况下,例如延迟渲染,您可能想要存储世界空间坐标而不关心它们的范围。
【讨论】: