【问题标题】:Difference between format and internalformat格式和内部格式的区别
【发布时间】:2016-04-02 12:28:22
【问题描述】:

我确实搜索并阅读了有关此的内容,但无法理解。

纹理内部格式和调用中的格式有什么区别

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

?

假设data 是一个由 32 x 32 像素值组成的数组,其中每个像素有四个字节(无符号字符数据 0-255),分别代表红色、绿色、蓝色和 alpha。

第一个GL_RGBA 和第二个有什么区别?为什么GL_RGBA_INTEGER 在这种情况下无效?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    format(第 7 个参数)与 type 参数一起描述了作为最后一个参数传入的 data。所以format/type组合定义了你传入的data的内存布局。

    internalFormat(第二个参数)定义了 OpenGL 应该用来在内部存储数据的格式。

    很多时候,两者会非常相似。事实上,使两种格式直接兼容是有益的。否则在加载数据时会发生转换,这会损害性能。 Full OpenGL 允许需要转换的组合,而 OpenGL ES 限制了支持的组合,因此在大多数情况下不需要转换。

    在这种情况下GL_RGBA_INTEGER 不合法的原因是关于支持formatinternalFormat 之间的哪些转换的规则。在这种情况下,internalFormatGL_RGBA 指定规范化格式,而formatGL_RGBA_INTEGER 指定输入由应用作整数的值组成。这两者之间没有定义转换。

    虽然仍然支持 internalFormatGL_RGBA 以实现向后兼容性,但在现代版本的 OpenGL 中,internalFormat 通常使用调整大小的类型。例如,如果要将数据存储为每分量 8 位 RGBA 图像,则 internalFormat 的值为 GL_RGBA8

    坦率地说,我认为定义这些 API 会有更简洁的方法。但这只是它的工作方式。在某种程度上,它以这种方式发展以保持对功能更有限的 OpenGL 版本的向后兼容性。较新版本的 OpenGL 添加了 glTexStorage*() 入口点,这使得其中一些更好,因为它将内部数据分配和数据规范分开。

    【讨论】:

    • 同样的立场:here 是我对此的最后澄清
    【解决方案2】:

    internal 格式描述了纹理应如何存储在 GPU 中。 format 描述了像素数据在客户端内存中的格式(与 type 参数一起)。

    请注意,内部格式确实指定了通道数(1 到 4)以及数据类型,而对于客户端内存中的像素数据,两者都通过两个单独的参数指定。

    GL 会将您的像素数据转换为内部格式。如果你想要高效的纹理上传,你应该使用匹配的格式,这样就不需要转换。但请注意,大多数 GPU 以BGRA 的顺序存储纹理数据,这仍然由内部格式 GL_RBGA 表示 - 内部格式仅描述通道数和数据类型,内部布局完全是 GPU 特定的.但是,这意味着通常建议使用GL_BGRA 作为客户端内存中像素数据的格式,以获得最佳性能。

    假设数据是一个 32 x 32 像素值的数组,其中 对于红色,每个像素是四个字节(无符号字符数据 0-255), 绿色,蓝色和阿尔法。 第一个 GL_RGBA 和第二个有什么区别?

    第一个,internalFormat 告诉 GL 它应该将纹理存储为 4 通道 (RGBA),并以首选精度(每通道 8 位)使用归一化整数。第二个,format 告诉 Gl,您按 R、G、B、A 顺序为每个像素提供 4 个通道。

    例如,您可以将数据提供为 3 通道 RGB 数据,如果内部格式保留为 RGBA,GL 会自动将其扩展为 RGBA(将 A 设置为 1)。您也可以只提供红色通道。

    反过来,如果您使用GL_RED 作为internalFormat,GL 将忽略输入数据中的 GB 和 A 通道。

    还要注意数据类型会被转换。如果您提供每个通道具有 32 位浮点数的像素 RGB,则可以使用GL_FLOAT。但是,当您仍然使用GL_RGBA 内部格式时,GL 会将这些转换为每通道 8 位比特的标准化整数,因此会丢失额外的精度。如果您希望 GL 使用浮点精度,您还必须使用像 GL_RGBA32F 这样的浮点纹理格式。

    为什么 GL_RGBA_INTEGER 在这种情况下无效?

    _INTEGER 格式用于非标准化整数纹理。 GL 中没有整数纹理的自动转换。你必须使用整数内部格式,AND你必须用一些_INTEGER格式指定你的像素数据,否则会导致错误。

    【讨论】:

    • 知道了,还有一个问题:GL_RGBA 是作为内部格式存储的有符号还是无符号? IE。我应该使用 sampler2D 还是 usampler2D 访问它?计算着色器的 rgba8ui 属性?
    • GL_RGBA 是一种标准化 无符号整数格式。标准化意味着您将使用标准sampler 类型将结果作为[0,1] 范围内的浮点(符号格式为[-1,1])访问。对于usamplerisampler 类型,您必须使用非规范化整数格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多