【问题标题】:How to use GL_HALF_FLOAT_OES typed textures in iOS?如何在 iOS 中使用 GL_HALF_FLOAT_OES 类型纹理?
【发布时间】:2011-12-23 22:14:21
【问题描述】:

我正在尝试创建一个浮动纹理来存储由片段着色器创建的渲染管道的中间结果。我需要片段的值是有符号的浮点数

我了解所有新的 iOS 设备都应该支持OES_texture_float 扩展(即根据Apple guide 从 iPhone 3GS/iPod Touch 3/iPad 开始)。

但是,当我使用

创建这样的纹理时
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL);

启动我的应用并在 Instruments 中检查它,它告诉我:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL) : (invalid enum=0x8d61): invalid enum for argument 'type'

奇怪的是,它仍然可以在我的 iPhone 4S 上运行,但不能在 iPhone 4 上运行(应该也支持)。但是,两个设备都会出现错误消息。但在 iPhone 4 上,OpenGL 无法使用此纹理作为渲染目标来构建有效的帧缓冲区对象。在完美运行的4S上。

你对我做错了什么有什么建议吗?

谢谢!

【问题讨论】:

    标签: ios opengl-es floating-point textures


    【解决方案1】:

    一年后我又遇到了这个问题。我做了一些研究,终于找到了解决方案:

    在几乎所有 iOS 设备上,都可以创建和使用浮动和半浮动类型的纹理。事实上,所有支持OES_texture_float 扩展(或OES_texture_half_float)的设备都允许创建浮点类型的纹理。

    然而,如果您尝试使用帧缓冲区对象将渲染到浮点型纹理,则设备还需要支持EXT_color_buffer_half_float 扩展。顾名思义,这个扩展允许将半浮点类型的纹理绑定到 FBO 的渲染目标。

    现在事实证明,这个扩展只支持具有 PowerVR SGX 543 或 554 显卡的设备,这些设备基本上都是在 iPhone 4S 之后(包括)发布的所有设备。您可以参考 Apple 的OpenGL ES Hardware Platform Guide for iOS 了解设备列表及其功能。

    总结:

    如果你想渲染一个浮点类型的纹理,你需要检查你的设备是否支持EXT_color_buffer_half_float扩展并且你需要创建你的纹理

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_HALF_FLOAT_OES, NULL);
    

    如果您的设备不支持半浮点颜色缓冲区,您只能将无符号字节类型的纹理绑定到您的 FBO:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    

    (请注意,纹理的格式和内部格式(本例中为GL_RGBA)取决于FBO的附着点。)

    【讨论】:

    • 嘿,你能渲染成单通道浮点纹理吗?代码看起来像这样:'glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, width, height, 0, GL_RED_EXT, GL_HALF_FLOAT_OES, NULL);'我无法获得输出。它说 FBO 不完整。
    • 如果您的设备支持EXT_texture_rg 扩展(除了EXT_color_buffer_half_float),您应该能够将单通道浮动纹理绑定到FBO。对我来说,它适用于 2 通道浮点数 (glTexImage2D(GL_TEXTURE_2D, 0, GL_RG_EXT, width, height, 0, GL_RG_EXT, GL_HALF_FLOAT_OES, NULL)) 和单通道无符号字节纹理。
    • 您好,感谢您的回复。我让半浮子工作。就像你说的, glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, width, height, 0, GL_RED_EXT, GL_HALF_FLOAT_OES, NULL) 。这适用于从 iPhone 4s 开始的所有设备。现在,我坚持使用浮动纹理。 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, width, height, 0, GL_RED_EXT, GL_FLOAT, NULL) 但这不起作用。我的帧缓冲区不完整。
    【解决方案2】:

    恐怕您没有做错任何事情,GL_HALF_FLOAT_OES 仅在 iPhone4S 和 iPad2 上受支持,尽管没有关于此效果的文档。浮动纹理是一个巨大的性能杀手,即使是基本的方差阴影映射实现也完全无法在 iPhone4S 上使用。

    【讨论】:

    • 很遗憾,但我猜你是对的。顺便提一句。即使在 iPhone 4S / iPad 2 上,我也会收到上面提到的 OpenGL 错误。但它确实有效......对我来说,性能(速度方面)与字节类型纹理相同。只是内存消耗高了一倍。
    • 郑重声明:新 iPad(第 3 代)也可以处理浮动类型的纹理。
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 2018-12-12
    • 2019-02-14
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2018-06-09
    相关资源
    最近更新 更多