Sign in to follow this  
Haraven

OpenGL FXAA and deferred rendering?

Recommended Posts

I've been trying to learn OpenGL for the past month or so, and I recently implemented deferred rendering into my wannabe engine. I wanted to add anti-aliasing to it, so I added an FXAA implementation.

The problem is I don't know when I'm meant to apply FXAA, or how exactly to apply it.
What I tried doing is:
- go through the geometry and lighting passes normally;
- where I would blit the final texture from the G buffer onto the main buffer, I instead blit it onto another buffer - tex_in (color attachment 0) will hold the G buffer's final texture; my new buffer has a second texture, called tex_out (color attachment 1), which I draw into;

- I bind tex_in, and I run the FXAA algorithm (use the shader program, with the appropriate uniforms set, and render a fullscreen quad);

- blit the result onto the main buffer.

The issue with this is that it seems to only render one frame (the very first), and nothing else. That first frame is anti-aliased, but it doesn't do me much good on its own. Also, glGetError() gives me no errors.

Source code is available here - you will find the relevant bits in fxaa.h & fxaa.cpp, and in the Run() and DefShadingPostProcessPass() functions, in app.h & app.cpp. The FXAA shaders are in the shaders folder (their names start with "fxaa").

Am I approaching this the wrong way? If so, what would be the right way of doing things?

Thanks in advance!

Edited by Haraven

Share this post


Link to post
Share on other sites

FXAA is a post processing effect, you take the final image, plus additional depth information (from your g-buffers or actual depth buffer, depending on your setup), calculate the edges from the depth discontinuities, then blur the final image based on how much depth discontinuities there are at each pixel.  With your steps, I'm not sure what you need to blit into another buffer for the second step.  You should actually be able to calculate the depth discontinuities and blur the final image all in a single pass, so you wouldn't need to blit to an additional buffer.  Just bind the final lit image, plus the depth buffer, as input, process and blur, then output the pixel to the screen.

Share this post


Link to post
Share on other sites

FXAA is a post processing effect, you take the final image, plus additional depth information (from your g-buffers or actual depth buffer, depending on your setup), calculate the edges from the depth discontinuities, then blur the final image based on how much depth discontinuities there are at each pixel.  With your steps, I'm not sure what you need to blit into another buffer for the second step.  You should actually be able to calculate the depth discontinuities and blur the final image all in a single pass, so you wouldn't need to blit to an additional buffer.  Just bind the final lit image, plus the depth buffer, as input, process and blur, then output the pixel to the screen.

I'll give that a shot, thanks!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this