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

标签 opengl-es-2.0

来自 OpenGL ES 2.0 specification第 4.4.5 节:

"Formats not listed in table 4.5, including compressed internal formats. are not color-, depth-, or stencil-renderable, no matter which components they contain."



Table 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 或亮度纹理作为可渲染颜色。您可以使用纹理 swizzle 扩展和/或 GLSL 矢量 swizzling 来复制行为。分机号:EXT_texture_rg添加纹理可用的红色和红色/绿色图像格式 渲染缓冲区。当您想使用 FBO 绘制成单 channel 或双 channel 图像格式时,这两种格式非常有用(因为 GL_LUMINANCEGL_ALPHAGL_LUMINANCE_ALPHA 不是可渲染的格式)。

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

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

    关于opengl-es-2.0 - 哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18688057/

    相关文章:

    opengl-es - YUV图像使用单个纹理还是多个纹理更好

    ios - Xcode 中的帧捕获失败

    android - 如何在 Android 应用程序上启用 msaa

    java - 2d sprites 中 vbo 的高效使用[opengl/android]

    c - 数组初始值设定项之间的区别

    android - Android 中的 OpenGL ES 2.0 上下文

    iphone - OpenGL ES 2.0 的推荐实践环境?

    ios - iPad 2 上的全精度浮点纹理

    android - 尝试在 API 8 (2.2) 的 OPENGL 2 中实现 VBO

    android - OpenGL ES 纹理包装有时会产生奇怪的结果