哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?

Posted

技术标签:

【中文标题】哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?【英文标题】:Which OpenGL ES 2.0 texture formats are color-, depth- or stencil-renderable? 【发布时间】:2013-09-08 19:58:25 【问题描述】:

来自OpenGL ES 2.0 specification 第 4.4.5 节:

"表 4.5 中未列出的格式,包括压缩的内部格式。不是 颜色、深度或模板可渲染,无论它们包含哪些组件。”

然后有扩展这个表的扩展例如:

OES_depth24 OES_depth32 OES_rgb8_rgba8 ARM_rgba8

如果我正确理解规范,表 4.5 会影响纹理和渲染缓冲区格式。在这种情况下,例如,除非支持扩展 OES_rgb8_rgba8(或 RGBA 的 ARM_rgba8),否则每个组件具有 8 位的 RGB 和 RGBA 纹理不可进行颜色渲染。

在支持 OES_rgb8_rgba8 的测试设备上,以下纹理格式有效,即当作为颜色附件附加到 FBO 时,帧缓冲区完整:

RGB 565 RGB 888 RGBA 4444 RGBA 5551 RGBA 8888

这些都不是:

阿尔法 8 亮度 8 亮度Alpha 88

结果符合我的假设(至少在 1 台设备上),但我想知道我是否正确理解了规范,或者这是偶然的?

【问题讨论】:

是的,这是正确的。官方规范中的可渲染格式列表正是 OpenGL ES 2.0 实现需要支持的。没有 OpenGL / OpenGL ES 的实现支持 alpha 或亮度纹理作为颜色渲染,但您可以使用纹理混合扩展和/或 GLSL 矢量混合来复制行为。当我们讨论 Luminance/Alpha 的主题时,您可能希望将 EXT_texture_rg 添加到您的扩展列表中,以增加颜色渲染格式的数量;它们使更换 Luminance/Alpha 变得更加容易。 最让我困惑的是,该规范正在谈论“渲染缓冲区图像格式”,而这似乎包括渲染缓冲区和纹理图像格式。 您可能应该将它们视为一般的图像格式。碰巧渲染缓冲区图像格式可用于渲染缓冲区和纹理。有很多图像格式只能用于纹理:压缩格式(可选)、亮度、alpha 等。要将纹理附加到 FBO 并绘制到其中,它必须是可以支持渲染缓冲区的格式. 这是有道理的。感谢您的 cmets,您不妨将其发布为答案。 【参考方案1】:

是的,你的假设是正确的。

官方规范中的可渲染格式列表正是 OpenGL ES 2.0 实现需要支持的。大多数支持比那里列出的要多得多。

但是,OpenGL / OpenGL ES 的任何实现都不支持将 alpha 或亮度纹理作为颜色渲染。您可以使用纹理调配扩展和/或 GLSL 矢量调配来复制该行为。扩展名:EXT_texture_rg 添加了可供纹理渲染缓冲区使用的红色和红色/绿色图像格式。当您想使用 FBO 绘制成单通道或双通道图像格式时,这两种格式非常有用(因为 GL_LUMINANCEGL_ALPHAGL_LUMINANCE_ALPHA 不是可渲染颜色的格式)。

一般来说,渲染缓冲区图像格式集是纹理图像格式的子集。您可以使用压缩图像格式(在 ES 2.0 中可选)、亮度和 alpha 图像格式进行纹理和像素传输操作,但渲染缓冲区不支持它们。这意味着虽然您可以使用这些纹理进行绘制,但不能通过将它们附加到 FBO 来绘制它们。要绘制到纹理中,它必须具有渲染缓冲区格式和纹理格式的图像格式。

根据历史记录,有一些渲染缓冲区格式可用作/不可用作纹理。多样本格式就是一个示例,在创建初始 FBO 规范之后添加了多样本纹理。

【讨论】:

以上是关于哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL ES 2.0 中使用 GL_FLOAT 创建纹理?

ETC1 纹理压缩保证在 OpenGL ES 2.0 Android 设备上可用?

OpenGL ES 2.0 Framebuffer 渲染到纹理 iOS:没有显示

如何在 OpenGL ES 2.0 中使用 png 图像纹理立方体?

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)