In order to optimize I'm trying to set up a setup which ping pong between same framebuffer two color attachments to apply some postprocess effects. It seems to work (effects are applied) but concurently I'm getting a lot of strange artifacts like:
- blinking squares
- borders on depth discontinuities
- color spilling on screen (window resize removes it)
Which change or disappear partly when I for example remove one step (one post process effect) from "ping ponging".
If I do this ordinary way using different framebuffers seems to remove them but I'm not 100% sure if it is not a mess in the shaders or something but they seem fine.
In each frame I'm doing ping pong like that:
First step - render to current color attach using other fb texture
fbDeferredLighting->bindFramebuffer(); //fb which has two color attachments glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); effect1->setConstPerFrameUniforms(); //get 0 attachment from fb scene prepass to apply effect and draw on fbDeferredLighting current color attach effect1->setTextureUniforms(fbScene, 0); quad->draw();
And then repeating some number of times: swap step and drawing, using same fb swapped attachment:
fbDeferredLighting->bindFramebuffer(); //after swap - now current=1, other=0 or current=0, other=1 std::swap(colorAttachment0Current, colorAttachment0Other); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texturesDiffuse[colorAttachment0Current]->getTextureID(), 0); glClear(GL_DEPTH_BUFFER_BIT); //only clear depth effectX->setConstPerFrameUniforms(); //get other color attach and use it to apply effect on current effectX->setTextureUniforms(fbDeferredLighting , colorAttachment0Other); quad->draw();
Is this correct?
EDIT: I wonder, maybe rewrite it to compute shaders, that would simplify things.