【问题标题】:Issue with RGBA32F texture format and mipmapping using OpenGL ES 3.0RGBA32F 纹理格式和使用 OpenGL ES 3.0 的 mipmapping 问题
【发布时间】:2017-06-26 07:00:51
【问题描述】:

当我使用glGenerateMipmap()RGBA32F 纹理生成mipmap 时,总是会出现INVALID_OPERATION 错误。绑定纹理或设置多种纹理参数都不起作用。

根据 OpenGL ES 3.0 规范,我发现 RGBA32F 不可过滤。那么这是错误的原因吗?

很遗憾,我在函数glGenerateMipmap 的 api 文档中找不到任何“支持的纹理格式”提示。如果是这样,那为什么RGBA16F 运行良好而 32 位浮点数却不行?

谢谢~

【问题讨论】:

    标签: opengl-es textures mipmaps opengl-es-3.0


    【解决方案1】:

    来自OpenGL ES 3.0 specification,第 3.8.10.5 节:

    如果 levelbase 数组未使用表 3.3 中的未调整大小的内部格式或根据表 3.13 既可颜色渲染又可纹理过滤的已调整大小的内部格式,则会生成 INVALID_OPERATION 错误. (强调)

    您已经说过 RGBA32F 不可纹理过滤,而 RGBA16F 是可过滤的,这就是它在后一种情况下有效但在第一种情况下无效的原因。

    另外the docs 在错误列表中明确提及:

    如果 levelbaselevelbase 数组未指定为未调整大小的内部格式或既可进行颜色渲染又可进行纹理过滤的已调整大小的内部格式,则会生成 GL_INVALID_OPERATION。

    【讨论】:

    • 哦,谢谢!我读过,但我没有完全理解它。我有一个困惑。根据声明,RGBA16F(不可渲染,但可过滤)也应该报错,但实际上它有效?
    • 一些 GPU 通过扩展支持超出规范要求的范围,或者支持更新的 OpenGL ES 版本。 OpenGL ES 3.2 要求 RGBA16F 是可渲染和可过滤的,如果驱动程序支持,它将自动为 3.x 上下文启用。我猜您的上下文实际上支持全部或部分 OpenGL ES 3.2(市场上大多数较新的 GPU 都支持)。
    • @solidpixel 你应该是对的。最终结果因具体硬件而异。
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多