这段代码应该使用framebuffer对象和渲染缓冲区清除黄色背景,但我得到的是黑色背景。
…
该 glBlitFramebuffer 操作失败,因为读缓冲区包含无符号整数值而默认帧缓冲区不包含。这得到了一个 GL_INVALID_OPERATION 错误。
glBlitFramebuffer
GL_INVALID_OPERATION
读缓冲区的格式是 GL_RGBA32UI
GL_RGBA32UI
glRenderbufferStorage( GL_RENDERBUFFER, GL_RGBA32UI, 500, 500);
而绘制缓冲区(默认帧缓冲区)的格式是无符号的 的 标准化 强> 整数格式(可能是 GL_RGBA8 )。
GL_RGBA8
如果您将内部格式更改为 GL_RGBA16 要么 GL_RGBA32F 你的代码将正常工作。
GL_RGBA16
GL_RGBA32F
注意,格式如 RGBA8 和 RGBA16 是标准化的浮点格式,可以存储范围[0.0,1.0]中的浮点值。 但格式如 RGBA16UI 和 RGBA32UI 是无符号整数格式,可以存储相应范围内的整数值。
RGBA8
RGBA16
RGBA16UI
RGBA32UI
规范说无符号整数值只能复制到无符号整数值。所以源格式必须是 *UI 目标格式必须是 *UI 也是。
*UI
看到 OpenGL 4.6 API兼容性配置文件规范 - 18.3.2 Blitting像素矩形 第662页:
void BlitFramebuffer( int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, bitfield mask, enum filter ); [...] 的 错误 强> [...] 如果不支持格式转换,则会生成INVALID_OPERATION错误,该错误在以下任何条件下发生: 读缓冲区包含定点或浮点值,任何绘制缓冲区都不包含定点或浮点值。 的 读缓冲区包含无符号整数值和任何绘制缓冲区 不包含无符号整数值。 强> 读缓冲区包含有符号整数值,任何绘制缓冲区都有 不包含有符号整数值。
void BlitFramebuffer( int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, bitfield mask, enum filter );
[...]
的 错误 强>
如果不支持格式转换,则会生成INVALID_OPERATION错误,该错误在以下任何条件下发生: