A few months back the NVIDIA Linux driver introduced support for FXAA, a new
anti-aliasing method. In this article are benchmarks of FXAA plus more information
on this post-process shader-based anti-aliasing method.
FXAA isn't meant to replace MSAA (Multi-Sample Anti-Aliasing) or other AA methods
but is rather something complementary. NVIDIA introduced this support to their
304.30 Linux graphics driver back in July while some games already provide
support for using FXAA directly. NVIDIA has also brought FXAA to game consoles
as this method of anti-aliasing is more lightweight compared to MSAA. NVIDIA offers
the source-code to a reference FXAA implementation for those interested.
FXAA is short for Fast Approximate Anti-Aliasing. This was designed by Timothy
Lottes of NVIDIA. Below is an email that Lottes sent to me that describes FXAA
in much more detail.
(1.) FXAA was designed to be a fast post-process shader based anti-aliasing
method which can improve image quality when an application or game cannot afford
to use hardware anti-aliasing methods like MSAA or CSAA. FXAA is not designed
to replace MSAA/CSAA or any other hardware AA method, but rather just offer another
FXAA is an interesting option for a game which is using deferred rendering
and doesn't have MSAA support, or for a notebook which cannot run 4xMSAA fast
enough in a specific game. But for games which have native MSAA support on higher-end
machines, the 4xMSAA option will have higher quality.
(1.a.) As a post-process filter running without multiple samples per pixel,
FXAA has some limitations as to what quality it can reach. FXAA can improve the
quality along edges, but it does not do a good job on near horizontal or near
vertical edges. Since FXAA runs without MSAA, it also attempts to find areas of
the image which might cause jittering in motion and reduces the contrast to reduce
the jittering in motion (compared to no-AA). This effect can look like a softening
of the image.
(2.) FXAA does not mix with MSAA/CSAA. FXAA is designed to find edges on no-AA
images, and the MSAA gradient steps confuse the FXAA filter. That being said some
developers like DICE with Battlefield3 on Windows, decided to offer an FXAA option
even with MSAA turned on, and this can increase quality on things like trees and
bushes which use a technique called "alpha test" which doesn't mix as
well with MSAA.
(3.) FXAA comes in two different forms: a driver-FXAA, and the following source
(a.) FXAA v1 which was released as an SDK sample (slow, but high quality).
(b.) FXAA v2 release in source form as a prototype for PS3 and 360 (fast, but
(c.) FXAA v3.11 release in source form as a highly optimized version of v1 and
v2 (has a PC and console mode).
The source versions of FXAA were designed as shaders a developer could download
and just integrate directly into their game or application. FXAA in this way was
portable to any Linux/Windows/Mac/PS3/360 machine, and the developer could change
and customize FXAA towards their application.
Later NVIDIA decided that it might be a good idea to offer some form of FXAA
as a driver option for games or apps which didn't already integrate FXAA. Games
that integrate FXAA source directly run FXAA before rendering the HUD or text
or UI elements, however the driver-FXAA only can be applied after the HUD/UI rendering
right before the frame gets sent to the display or composited for windowed mode.
So driver-FXAA has the disadvantage of being applied to text, and FXAA will soften
the text a little. Also on top of this the driver-FXAA is a little more expensive
because it has some extra logic to reduce the filtering on text compared to the
source versions of FXAA.
One other thing with driver-FXAA, is that you might have a hard time getting
screen shots. At least on Windows I can confirm that driver-FXAA is applied after
utilities like fraps grab their captures. On Linux I'm not sure exactly where
the driver team did the integration, but guessing you will have the same problem.
On the following pages are benchmarks showing the performance of Fast Approximate
Anti-Aliasing on various NVIDIA GeForce GPUs.