【问题标题】:WebGL2 Copy depth value to default renderbuffer errorWebGL2将深度值复制到默认渲染缓冲区错误
【发布时间】:2016-11-25 15:08:09
【问题描述】:

为了实现延迟着色,我使用了一个 fbo 来做多个渲染目标。

现在这种方法有效,但我想为背景添加一个天空球体。

显然这个天空球不属于延迟渲染周期,所以我必须在第二遍渲染。

但是,为了正确渲染天空球体,我必须检索深度值,因此延迟渲染纹理不会阻挡球体。

为此,我将深度纹理从 G 缓冲区复制到默认帧缓冲区:

     gl.bindFramebuffer( gl.READ_FRAMEBUFFER, gDeferredDrawer.FrameBuffer.Context );
     gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null ); 
     gl.blitFramebuffer( 0, 0, gl.viewportWidth, gl.viewportHeight, 0, 0, gl.viewportWidth, gl.viewportHeight, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
     gl.bindFramebuffer( gl.FRAMEBUFFER, null );

这种方法不起作用。 WebGL 给我这个错误信息:

GL ERROR :GL_INVALID_OPERATION : glBlitFramebufferCHROMIUM: 目标帧缓冲区是多重采样的

我真的不知道我是怎么做错的。据我所知,互联网上没有明确的例子。那么有人可以请教我吗?

【问题讨论】:

    标签: webgl2


    【解决方案1】:

    from the spec 第 4.3.2 节

    如果绘图帧缓冲区的 SAMPLE_BUFFERS 大于零,则 生成了 INVALID_OPERATION 错误。

    您不能使用blitFramebuffer 来传送多采样目标。您只能多采样源读取。

    所以,如果你想使用你描述的技术,那么

    1. 使用另一个帧缓冲区,在该帧缓冲区中组合,然后复制到画布。

    2. 使画布不被多重采样

      const gl = someCanvas.getContext("webgl2", { antialias: false });
      

    我猜你的情况#2 更好。如果您实际上正在执行所有可以从某些屏幕外帧缓冲区上的多重采样中受益的渲染,那么没有理由使用多重采样画布。

    【讨论】:

    • 非常感谢您的反馈!我通过使用额外的 FBO 来解决它,并与延迟着色器共享输出纹理和渲染缓冲区,并且效果很好。再次感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多