TAA, SMAA, FXAA, MSAA or SSAA, which one should you choose. Four options and this is just anti-aliasing we’re talking about here. Modern games include a slew of graphics settings to choose from in order to get the best performance for your hardware. Other than Anti-Aliasing (AA), you’ve got, Ambient Occlusion, Screen Space Reflections, Shadows, Texture Filtering, Post-Processing, and much more. What do all these graphics settings do, and more importantly how they impact the visual fidelity in your favorite games? Let’s find out!
Anti-Aliasing: SMAA vs TAA vs FXAA vs MSAA
Let’s start off with anti-aliasing. It’s one of the primary graphics settings you’ll find in games. You’ve got the traditional MSAA, SSAA, FXAA, and the newer shader-based SMAA and temporal techniques (TAA) that have become the norm. So, what does anti-aliasing do? In short, it gives the image a cleaner look by removing the rough or jagged edges around objects.
Here’s an example of how FXAA (fast approximate anti-aliasing) improves the image quality by reducing the jaggies. Enlarge the images and see how the second one is notably smoother. Here’s another comparison of how AA impacts your game. Here you can see SMAA in action:
The differences are subtle but exist across the entire image. Check the electric pole and the wiring. They lose the teeth on the edges when SMAA is turned on. The buntings and the vegetation also get the same treatment. However, unlike FXAA, SMAA isn’t too strong. It gets rid of the aliasing, without blurring the texture detail.
There are two main types of anti-aliasing techniques:
Traditional Upscaling: These mainly include MSAA (Multi-Sampling AA) and SSAA (Super Sampling AA) which were popular last-gen and for good reason. They produce the best image quality (broadly speaking) but the performance hit is severe. They work by rendering the image at a higher resolution and then scaling it down to fit the native resolution. This essentially makes the entire image more detailed and sharper, scaling down the rough edges in the process but not removing them entirely. Here’s an example:
Super Sampling renders the entire image at a higher resolution and then scales it down to fit the target resolution. The exact rendering resolution depends on the developer. The image can be downscaled along both the x and y-axis or one of them.
MSAA or multi-sampling uses edge-detection algorithms to detect aliasing (based on contrast differences) and then renders only those parts at a higher resolution. Once again, the amount of sampling varies from 2x to 8x. In most cases, SSAA and MSAA miss transparent textures as most edge detection filters fail to recognize them. Furthermore, they tend to reduce the intensity of aliasing, rather than completely eliminate it.
Shader based: Shader based AA techniques are more efficient and don’t impact the performance by much. They work by applying a slight blur to the edges, making the image smoother but at the same time reducing the sharpness. FXAA is a good example of how shader based AA gets rid of aliasing but reduces the level of detail by applying a blur filter.
Newer methods such as SMAA greatly reduce the blur intensity while also eating up most of the jaggies. However, it suffers from the same drawback as MSAA: It doesn’t work with transparent textures. The latest and most popular form of AA is temporal anti-aliasing. TAA focuses on removing temporal aliasing or shimmering. It’s most evident in motion. Temporal aliasing is caused when the frame rate is too low compared to the transition speed of the objects in the scene. This makes the boundaries of the objects appear in motion. Here’s a comparison of TAA vs no AA:
TAA works by comparing neighboring frames (temporally) and blending them to create a cleaner image in motion.
The present frame is rendered along with the geometry and shading, after which it is reprojected on the previous image using the jitter offsets and motion vectors. After that a rectify filter is used to compare the frame and check for any ghosting, after which the post-processing effects are applied, thereby completing the frame. Similarly, this frame is used for reconstructing (by reprojection) the next consecutive frame, and the process continues.
As TAA is essentially an approximation of sorts: That is it uses two images to extrapolate the final image, it also causes a good deal of blurring, losing some texture detail in the process. This is evident in the above image.
Temporal upscaling uses a similar method to upscale lower-resolution images. The core difference is that unlike TAA, alternating pixels are rendered in consecutive frames, and filling the gaps using interpolation and samples from the neighboring frames.
Here’s a comparison of FXAA vs TAA used on the same image:
The main advantages of TAA over FXAA are more pronounced in motion. The “teeth” at the boundaries of the objects appear to be moving when you are in motion in-game. TAA works to smoothen these artifacts while FXAA simply applies a “Vaseline filer” which although effective, produces curvy lines that jump around when there’s a transition in the scene.
There are two kinds of shadows in games. “Shadows” and “Ambient Occlusion”. The latter refers to the ambient shadows that exist in crevices, edges and on surfaces hidden from the sun. The casting object and the shadow often overlap here. The primarily ambient occlusion technique is Screen Space Ambient Occlusion and it’s improved variant Horizontal Based Ambient Occlusion.
There are also the newer VXAO and ray-traced AO but those are still quite rare, so we won’t bother. If you do want to know about them, just remember that voxels (3D triangles) form the basis of VXAO while ray-tracing is used for the latter.
SSAO and HBAO are rough hacks that calculate (using an integral) where the light will penetrate and which areas will be shadowed. It’s an approximation rather than the actual thing.
Global Illumination is a form of ambient occlusion which is usually more accurate than SSAO and it’s derivatives. RTVGI (Real-Time Voxel-Based Global Illumination) and Sparse Voxel Octree Global Illumination (SVOGI) are some notable examples of GI. You can read more about it here.
Level of Detail (LOD)
The level of detail sets the object complexity and the in-game distance (from the camera) after which objects lose detail (or get blurred). It is often dubbed as environmental quality, terrain detail, game detail, rendering quality or some other related term in games for simplicity.
It affects the mesh quality of objects which actually just refers to the number of polygons rendered per object and in turn, the draw calls the CPU will need to send. As a result, a game with rich levels of detail will require a powerful CPU as well as a capable GPU.
Texture detail is like LOD except, no rendering happens here. These are the pre-baked textures that get loaded onto your graphics card’s VRAM and act as the skins of the in-game objects (meshes). The more detailed the textures, the more realistic will they look and accordingly consume more memory.
Texture filtering is one of those settings that makes your game look sharper. Well, then how is it different from the regular sharpening filter?
Texture filtering simply makes sure that the mipmaps of the textures are properly visible from the in-game camera. Traditionally, mipmaps are smaller than the original texture by a factor of 2 and there are points (texels) where the multiple mipmaps may converge. As such, these must be filtered to avoid blurring and other artifacts.
Bilinear filtering, the simplest form of texture filtering uses the following approach to calculate the color of a texel: It takes four texel samples from the approximate position of the texel as indicated by the game engine and calculates its average which is then used as the final value. However, bilinear filtering only uses samples or texels from mipmaps identified by the game engine and if at any point with prespective-distorted textures, two different mipmaps are used, there are shifts in texture clarity.
Trilinear filtering improves on bilinear filtering by continuously sampling and interpolating (averaging) texels from the two closest mipmap sizes for the target texel, but like BF, this technique assumes that the texture is displayed as a square from the player’s perspective, and suffers a loss in quality when viewed from an oblique angle (especially when perpendicular to the screen).
This is due to the texel covering a depth (area along the axis perpendicular to the screen) longer than and a width narrower than the samples extracted from the mipmaps, resulting in blurring due to under and over-sampling, respectively.
To solve this, anisotropic filtering scales either the height or width of a mipmap by a ratio relative to the angle of the texture against the screen. The ratio is dependent on the maximum sampling value specified, followed by taking the appropriate samples. AF can function with anisotropy levels between 1 (no scaling) and 16, defining the maximum degree by which a mipmap can be scaled by, but AF is commonly offered to the user in powers of two: 2x, 4x, 8x, and 16x.
The difference between these settings is the maximum angle that AF will filter the texture by. For example, 4x will filter textures at angles twice as steep as 2x, but will still apply standard 2x filtering to textures within the 2x range to optimize performance.
Remember NVIDIA’s godrays? Yeah, that’s basically what volumetric lighting is. Team green uses tessellated godrays which are more performance-intensive but look better too. Traditional volumetric lighting simply is a demonstration of how the sun rays (or any rays) appear and behave in the game world.
Screen Space Reflections
Screen space reflections is a technique to render dynamic in-game reflections. It is quite taxing and for good reason. SSR basically re-renders the scene on transparent surfaces. However, it only does so for the objects visible on the screen. If there are other objects that are present in the same location but not visible on the screen, they will be culled.
Another popular refection technique is cube-mapping. In this, the textures are pre-baked onto the various sides of a cube and stored as six square textures or unfolded into six square regions of a single texture.
Tessellation is a DX11 based technique used to increase the level of detail in a scene without increasing the texture size. It is done by dividing the polygons into smaller ones to improve the mesh complexity and detail.
Tesselation is a technique that allows you to reproduce primitives (triangles, lines, points and such) in a 3D application. It does this by repeatedly subdividing the current geometry into a finer mesh.
This allows you to load a relatively coarse mesh, generate more vertices and triangles dynamically and then make it into a finer mesh.
Post-processing generally refers to effects that are implemented in the last phase of rendering, after all the other effects like tessellation, multi-sampling, reflections, and shadows are done. It includes shader-based effects such as depth of field, motion blur, ambient occlusion and sometimes FXAA or SMAA as well.
Another widely used technique, V-Sync basically caps your in-game frame rate to your monitor’s refresh rate, preventing screen tearing. It does so by slowing down the GPU pipeline to make sure the frame rate doesn’t go above your refresh rate. However, this can also affect your performance negatively by inadvertently making your game lag or inducing an input lag. Read more on it here: