WebGL2将深度值复制到默认的渲染缓冲区错误

时间:2016-11-25 03:44:23

标签: webgl2

为了实现延迟着色,我使用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:目标帧缓冲是多重采样

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

1 个答案:

答案 0 :(得分:3)

from the spec第4.3.2节

  

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

您无法使用generic.Invoke(null, new object[] { new object() }); 将多个采样目的地的 blit 。您只能从多采样源中读取

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

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

  2. 使画布不是多重采样

    blitFramebuffer
  3. 我猜测#2在你的情况下更好。如果您实际执行的所有渲染都可以从一些屏幕外帧缓冲区的多次采样中受益,那么没有理由拥有多采样画布。