WebGL2:不完整的帧缓冲区

Posted

技术标签:

【中文标题】WebGL2:不完整的帧缓冲区【英文标题】:WebGL2 : incomplete framebuffer 【发布时间】:2021-09-01 15:47:21 【问题描述】:

我正在将 C++/OpenGL 应用程序移植到 WebGL 中,并且正在尝试创建和配置帧缓冲区。

帧缓冲区有 3 种我们可以写入的纹理类型:vec2、vec2、uint。 (gl.RG32F, gl.RG32F, gl.R32UI)

这是我初始化帧缓冲区的方式:

var gbuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, gbuffer);

var z0_texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, z0_texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, output_canvas.width, output_canvas.height, 0, gl.RG, gl.FLOAT, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, z0_texture, 0);

var zn_texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, zn_texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, output_canvas.width, output_canvas.height, 0, gl.RG, gl.FLOAT, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, zn_texture, 0);

var n_texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, n_texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, output_canvas.width, output_canvas.height, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT2, gl.TEXTURE_2D, n_texture, 0);

gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2]);

帧缓冲区不完整:gl.checkFramebufferStatus(gl.FRAMEBUFFER) 返回gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT 并显示警告:Framebuffer not complete. (status: 0x8cd6) COLOR_ATTACHMENT1: Attachment has an effective format of RG32F, which is not renderable.

知道我的代码有什么问题吗?

【问题讨论】:

"附件的有效格式为RG32F,不可渲染" - 你有什么不明白的地方? gl.RG32F 不是可呈现的格式。因此,您不能将其用于帧缓冲区。您必须使用可呈现颜色的格式。请参阅OpenGL ES 3.0 Specification - Table 3.13(WebGL 2.0 非常符合 OpenGL ES 3.0) 我不想渲染这些纹理。我在后期处理中使用它们。这就是我在 C++ 中所做的,但在 WebGL 中却做不到。 没有。你不能在 WebGL 中做同样的事情。在 OpenGL 中,RG32F 可以进行颜色渲染。但是,WebGL 基于 OpenGL ES。在 OpenGL ES 中,gl.RG32F 不是颜色可渲染格式。 “可渲染颜色”并不意味着您可以渲染这些纹理。这意味着您可以使用这种格式渲染到纹理中。 @Rabbid76 好的,谢谢。很高兴知道 【参考方案1】:

我不想渲染这些纹理。我在后期处理中使用它们。这就是我在 C++ 中所做的,但在 WebGL 中却做不到。

没有。你不能在 WebGL 中做同样的事情。

错误消息“附件的有效格式为 RG32F,不可渲染” - 表示 gl.RG32F 不是可渲染格式。因此,您不能将其用于帧缓冲区。您必须使用可呈现颜色的格式。请参阅OpenGL ES 3.0 Specification - Table 3.13(WebGL 2.0 非常符合 OpenGL ES 3.0)。 您不能在 WebGL 中像在 desktop OpenGL 中那样做同样的事情。在 桌面 中,OpenGL RG32F 是可渲染颜色的。但是,WebGL 基于 OpenGL ES。在 OpenGL ES 中,RG32 不是颜色可渲染格式。 “可渲染颜色”并不意味着您可以渲染这些纹理。这意味着您可以使用这种格式渲染到纹理中。

【讨论】:

以上是关于WebGL2:不完整的帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

iOS OpenGL ES Analyzer 列出“不存在的帧缓冲区附件”和“缺少帧缓冲区附件”,但 FBO 工作

绕过操作系统并绘制到 GPU 的帧缓冲区

WebGL:在带有深度模板纹理附件的帧缓冲区上未清除颜色

无法将简单的帧缓冲区渲染到四边形并显示

在我的嵌入式系统中填充外部 ram 中的帧缓冲区非常慢 [关闭]

我的帧缓冲区有啥问题?