1

为了实现延迟着色,我使用了一个 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 错误:GL_INVALID_OPERATION:glBlitFramebufferCHROMIUM:目标帧缓冲区是多重采样的

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

4

1 回答 1

4

来自规范第 4.3.2 节

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

您不能使用blitFramebufferblit多采样目标。您只能多采样源中读取。

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

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

  2. 使画布不被多重采样

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

我猜#2在你的情况下更好。如果您实际上正在执行将受益于某些屏幕外帧缓冲区上的多重采样的所有渲染,则没有理由拥有多重采样画布。

于 2016-11-25T07:08:09.890 回答