14

OpenGL ES 2.0 规范第 4.4.5 节:

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

表 4.5

然后有扩展此表的扩展,例如:

如果我正确理解规范,表 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 台设备上),但我想知道我是否正确理解了规范,或者这是偶然发生的?

4

1 回答 1

10

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

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

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

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

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

于 2013-09-09T02:19:32.563 回答