【问题标题】:What exactly is a floating point texture?究竟什么是浮点纹理?
【发布时间】:2011-04-18 21:16:59
【问题描述】:

我尝试阅读 OpenGL ARB_texture_float 规范,但我仍然无法理解它..

浮点数据与我加载到纹理中的图像中的普通 8 位每通道 RGBA 或 RGB 数据有何关系?

【问题讨论】:

    标签: opengl floating-point textures


    【解决方案1】:

    这里是关于它的一点点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 一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以附加为渲染目标。例如。您不能附加亮度和强度格式。

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

    希望这会有所帮助。

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它们对于将数据获取到着色器(例如等值)也很有用。
    • 那么,您将如何读取每通道 8 位的普通 RGB 或 RGBA 图像,以及如何在内部解释这些值?例如0-255 或 0-1 范围内的值是否会在内部缩放到其他范围?
    • @lok​​stok。 glTexImage 有一个称为“标准化”的参数。如果设置为“true”,您的输入字节将在 [0,1] 范围内转换。否则我想你会得到 [0-255] (我没有尝试过)。
    猜你喜欢
    • 2014-10-28
    • 2012-08-27
    • 2010-11-12
    • 2011-03-18
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多