Webgl 2.0中的Msaa-在四边形上执行Msaa

问题描述 投票:0回答:1

我尝试在帧缓冲区上执行MSAA,并且在独立版本中,我在帧缓冲区上绘制一个多维数据集,然后将该帧缓冲区涂到画布上,就像魅力一样工作:

var gl = canvas.getContext("webgl2", {
    antialias: false
});

const frambuffer = gl.createFramebuffer();
const renderbuffer = gl.createRenderbuffer();

gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, gl.getParameter(gl.MAX_SAMPLES), gl.RGBA8, this.width, this.height);
gl.bindFramebuffer(gl.FRAMEBUFFER, frambuffer);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer);

.. Prepare scene

gl.bindFramebuffer(gl.FRAMEBUFFER, frambuffer);

.. Draw scene

gl.bindFramebuffer(gl.READ_FRAMEBUFFER, frambuffer);
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
gl.clearBufferfv(gl.COLOR, 0, [1.0, 1.0, 1.0, 1.0]);
gl.blitFramebuffer( 0, 0, canvas.width, canvas.height,
                    0, 0, canvas.width, canvas.height,
                    gl.COLOR_BUFFER_BIT, gl.LINEAR);

但是,当我在发动机中使用延迟管道执行此操作时,将执行blit,但不会执行MultiSample(MSAA)。我能想到的区别是,我在那里将绘制到四边形的图像写入帧缓冲区,在工作示例中是立方体。

根据要求,在不起作用的情况下,安装程序是这样的:

var gl = canvas.getContext("webgl2", {
    antialias: false
});

.. Load resources ..


.. Prepare renderpasses ..

shadow_depth for every light 
deferred scene 
ssao
shadow for first light
convolution on ssao and shadow
convolution 
uber for every light
tonemap 
msaa

..

.. draw renderpasses ..

deferred scene 
ssao
shadow for first light
convolution on ssao and shadow
convolution 
uber for every light
tonemap 

...

const frambuffer = gl.createFramebuffer();
const renderbuffer = gl.createRenderbuffer();

gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, gl.getParameter(gl.MAX_SAMPLES), gl.RGBA8, this.width, this.height);
gl.bindFramebuffer(gl.FRAMEBUFFER, frambuffer);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer);

gl.bindFramebuffer(gl.FRAMEBUFFER, frambuffer);

..draw tonemap of scene to quad


gl.bindFramebuffer(gl.READ_FRAMEBUFFER, frambuffer);
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
gl.clearBufferfv(gl.COLOR, 0, [1.0, 1.0, 1.0, 1.0]);
gl.blitFramebuffer( 0, 0, canvas.width, canvas.height,
                    0, 0, canvas.width, canvas.height,
                    gl.COLOR_BUFFER_BIT, gl.LINEAR);

webgl deferred msaa
1个回答
0
投票

renderbufferStorageMultisample仅需要应用于具有initial 3D内容的帧缓冲对象。在进行后处理时,多重采样没有效果,因为仅对1个或2个三角形进行了栅格化,并且它们跨越了整个视口。

© www.soinside.com 2019 - 2024. All rights reserved.