2

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

帧缓冲区有三种类型的纹理可以写入:vec2、vec2和uint。(全球RG32F、全球RG32F、全球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.tex参数(gl.TEXTURE_2D,gl.TESTURE_MIN_FILTER,gl.NEAREST);gl.tex参数(gl.TEXTURE_2D,gl.TESTURE_MAG_FILTER,gl.NEAREST);gl.帧缓冲区纹理2D(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.tex参数(gl.TEXTURE_2D,gl.TESTURE_MIN_FILTER,gl.NEAREST);gl.tex参数(gl.TEXTURE_2D,gl.TESTURE_MAG_FILTER,gl.NEAREST);gl.帧缓冲区纹理2D(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.tex参数(gl.TEXTURE_2D,gl.TESTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.帧缓冲区纹理2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT2,gl.TEXTURE_2D,n_TEXTURE,0);gl.drawBuffers([gl.COLOR_ATTACHMENT0,gl.COLROR_ATTACHMENT1,gl.CLOR_ATTAC HMENT2]);

帧缓冲区不完整:gl.检查帧缓冲状态(gl.FRAMEBUFFER)收益gl.FRAMEBUFFER_INCOMPLETE_附件并显示警告:帧缓冲区不完整。(状态:0x8cd6)COLOR_ATTACHMENT1:附件的有效格式为RG32F,无法渲染。

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

4
  • 附件的有效格式为RG32F,无法呈现-你不明白什么?全球RG32F不是可渲染格式。因此,不能将其用于帧缓冲区。必须使用彩色可渲染格式。请参阅OpenGL ES 3.0规范-表3.13(WebGL 2.0版严格遵守OpenGL ES 3.0)
    – 兔子76
    评论 2021年9月1日16:13
  • 我不想渲染这些纹理。我在后期处理中使用它们。这就是我在C++中所做的,但在WebGL中却做不到。
    – 巴米亚
    评论 2021年9月1日19:28
  • 1
    不可以。您不能在WebGL中执行相同的操作。在OpenGL中RG32F型是可渲染的颜色。然而,WebGL是基于OpenGL ES的全球RG32F不是彩色可渲染格式。“颜色可渲染”并不意味着可以渲染这些纹理。这意味着您可以使用此格式渲染为纹理。
    – 兔子76
    评论 2021年9月3日20:00
  • @拉比76好的,谢谢。很高兴知道
    – 巴米亚
    评论 2021年9月4日13:43

1个答案1

重置为默认值
2

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

不可以。您不能在WebGL中执行相同的操作。

错误度量附件的有效格式为RG32F,无法呈现-意味着全球RG32F不是可渲染格式。因此,不能将其用于帧缓冲区。必须使用彩色可渲染格式。请参阅OpenGL ES 3.0规范-表3.13(WebGL 2.0版符合OpenGL ES 3.0)。
你不能在WebGL中做与在中相同的事情桌面OpenGL。桌面OpenGL(OpenGL)RG32F型是可渲染的颜色。然而,WebGL是基于OpenGL ES的RG32型不是可渲染颜色的格式。“颜色可渲染”并不意味着可以渲染这些纹理。这意味着您可以使用此格式渲染为纹理。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.