Msaa в Webgl 2.0 - выполнить Msaa на четырехугольнике - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь выполнить 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);

Но когда ясделать это в моем движке с отложенным конвейером, блиц выполняется, но 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);

...