我正在将一个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.
知道我的代码出了什么问题吗?
发布于 2021-09-10 07:18:57
我不想渲染这些纹理。我正在后处理中使用它们。这就是我在C++中做的,但在WebGL中不能做同样的事情。
不是的。您不能在WebGL中执行相同的操作。
错误的意思是“附件有一个有效的RG32F格式,这是不可渲染的”-意味着gl.RG32F
不是一个可渲染的格式。因此,不能将其用于帧缓冲区。必须使用颜色可渲染格式。请参阅OpenGL ES 3.0 Specification - Table 3.13 (WebGL 2.0与OpenGL ES 3.0紧密一致)。
你不能像在桌面OpenGL中那样在WebGL中做同样的事情。在桌面OpenGL中,RG32F
是可渲染的颜色。但是,WebGL基于OpenGL ES。在OpenGL ES中,RG32
不是一种颜色可渲染格式。“颜色可渲染”并不意味着你可以渲染这些纹理。这意味着您可以使用此格式渲染到纹理中。
https://stackoverflow.com/questions/69016956
复制相似问题