首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Webgl 2.0中的Msaa -在四边形上执行Msaa

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

Stack Overflow用户
提问于 2019-12-11 22:30:28
回答 1查看 450关注 0票数 0

我尝试在帧缓冲区上执行MSAA,在独立版本中,我在帧缓冲区上绘制一个立方体,并将帧缓冲区blit到画布上,它的工作方式就像一个护身符:

代码语言:javascript
复制
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)。我能想到的不同之处在于,我在那里将绘制到一个四边形的图像写到帧缓冲区,在工作示例中是一个立方体。

按照要求,在它不工作的情况下,设置如下:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2019-12-12 20:14:20

只需将renderbufferStorageMultisample应用于具有初始3D内容的帧缓冲区对象。执行后期处理时,多重采样不起作用,因为只栅格化了1或2个三角形,并且它们跨越整个视口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59288035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档