来自 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."
然后有扩展此表的扩展,例如:
如果我正确理解规范,表 4.5 会影响纹理和渲染缓冲区格式。在这种情况下,例如,除非支持扩展名 OES_rgb8_rgba8(或 RGBA 的 ARM_rgba8),否则每个组件 8 位的 RGB 和 RGBA 纹理是不可渲染的。
在支持 OES_rgb8_rgba8 的测试设备上,以下纹理格式是有效的,即当作为颜色附件附加到 FBO 时,帧缓冲区完整:
而这些不是:
结果符合我的假设(至少在 1 台设备上),但我想知道我是否正确理解了规范,还是这是偶然的?
最佳答案
是的,你的假设是正确的。
官方规范中的可渲染格式列表正是 OpenGL ES 2.0 实现需要支持的格式。大多数支持比那里列出的要多得多。
但是,没有 OpenGL/OpenGL ES 的实现支持 alpha 或亮度纹理作为可渲染颜色。您可以使用纹理 swizzle 扩展和/或 GLSL 矢量 swizzling 来复制行为。分机号:EXT_texture_rg
添加纹理可用的红色和红色/绿色图像格式 和 渲染缓冲区。当您想使用 FBO 绘制成单 channel 或双 channel 图像格式时,这两种格式非常有用(因为 GL_LUMINANCE
、 GL_ALPHA
和 GL_LUMINANCE_ALPHA
不是可渲染的格式)。
一般来说,渲染缓冲区图像格式集是纹理图像格式的子集。您可以使用压缩图像格式(在 ES 2.0 中可选)、亮度和 alpha 图像格式进行纹理和像素传输操作,但渲染缓冲区不支持它们。这意味着虽然您可以使用这些纹理进行绘制,但不能通过将它们附加到 FBO 来绘制它们。要绘制到纹理中,它的图像格式必须为 两者 渲染缓冲区格式和纹理格式。
根据历史记录,有些渲染缓冲区格式可/不可用作纹理。多样本格式就是一个例子,在创建初始 FBO 规范后添加了多样本纹理。
关于opengl-es-2.0 - 哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18688057/