facebook rss twitter

GPU Antialiasing

by Parm Mann on 20 October 2008, 00:00

Quick Link: HEXUS.net/qarsj

Add to My Vault: x

Overview

This HEXUS.help guide explains multi- and super-sampling anti-aliasing.

The Technology

This HEXUS.help guide will assume you know the affects of applying a level of anti-aliasing (AA) on your 3D accelerator, be it via the driver control panel or via a control in your game. We assume you know the effect it has on image quality, so you can think about a before and after scenario. So this HEXUS.help guide isn't about explaining what it does as such, although it will, it's about explaining the how and why. So if you've ever wondered how or why AA works, this guide is for thee. We assume a slight level of technical knowledge in places, but nothing that will blow your brain to bits.

So you know AA makes the image on your screen look better, probably because of it smoothing out jaggies on the edges of on-screen objects. But how does it do so? The answers largely lie in the understanding of two key principles of 3D rendering that might not be immediately apparent or obvious.

Pixels aren't as atomic as you think

While the pixel is ultimately what ends up on your screen, each made up of just one colour composed of a red, green and blue component (and luminance of course), it's never just processed as a single colour before it gets to the display. During rendering on the GPU, a pixel can be covered by more than one piece of geometry (decomposed into triangles as you know). It's that concept of more than one triangle per pixel, and thus possibly more than one colour per pixel before final output, that's the first key to understanding what AA is all about.

Filtering. It's all about the filtering.

So, given more than one colour per pixel before rendering, how do you resolve that into the single colour the display needs? The answer is filtering. Think about a pixel half covered by a white triangle, half covered by a black one. Like so, infact.

That final screen pixel obviously can't be both black and white at the same time, since it can only be one colour. So what colour should it be? Grey, right, half way between black and white? Correct. Given RGB (0,0,0) as black and RGB (255,255,255) as white on an 8-bit per channel display (2^8 is 256, remember), interpolating linearly between white and black would give you RGB (128,128,128), since half 256 is 128, and we want the median colour. Using the wonders of modern web markup, that colour is this.

But how do you get that colour from the pixel above? More specifically, how do you get the data to filter the colours in the pixel to get that grey? What the GPU wants to do, since there's a frequency to that data (from 0,0,0 to 255,255,255 in our example), is actually measure and filter a signal made up of colour data, much like you would in any DSP application such as audio processing or motion video decoding. Data presented needs to be filtered before it can be passed on to the next part of the algorithm, which in our case is pushing pixels to your display, and it's filtering that's the second key component to understanding what's going on. For the adventurous, Google for Nyquist's Theorem ;)

Therefore anti-aliasing is pretty much just sub-pixel filtering, right?
Yes, it pretty much is. You need to look at different points inside the pixel, before final colour output, and it's that sub-pixel analysis and susequent filtering of that data provided by the analysis that determines final colour and therefore how effective the anti-aliasing is. You want the grey because of the bordering pure black and white triangles, so let's show you how a modern GPU gets there.

Colour sampling

We've already discussed sampling and filtering the colour inside the pixel, so we'll quickly run over how that's done on almost all modern GPUs. The GPU has a fixed grid masked across the pixel which marks it out into areas. Then, depending on how many samples the GPU is able to take, it has a look inside some of those areas, collecting data. With colour sampling it collects colour, of course.

Here's our pixel again, but this time with some different coloured, overlapping triangles and the grid we just talked about.

For the purposes of this HEXUS.help guide we've made our triangles opaque, mostly so you can see the grid but also to somewhat simulate the interpolation between colours in the pixel to generate the final one -- our filtering again. The large orange dots are the points inside the pixel that the GPU will sample colour from. In our case, the four colour samples give us decent coverage in the pixel for the red, green and white polygons (remember a triangle is just a polygon) in order to make a decent attempt at filtering for the final colour.

In this case, average between two samples of full white (255,255,255), one sample of full red (255,0,0) and one sample of full green (0,255,0) gives us an RGB value of 192,192,128, which looks like this.

So that's our sub-pixel sampling with colour, also more commonly called super-sampling. The super part of the name comes from the fact you're taking more than one colour sample per-pixel, and it's NVIDIA graphics boards that most commonly offer up any user-choosable super-sampling modes. More on that later.

Depth sampling

There's another method of sub-pixel sampling and filtering that also anti-aliases pixels, that doesn't take into account just pixel colour. Sub-pixel depth sampling takes into account the depth of the triangles providing the full pixel coverage. Depth is stored in a separate sample buffer per-pixel, seeded by the depth buffer (commonly called the Z-buffer), and when the GPU comes to anti-aliasing just before final colour writing as before, it samples Z multiple times in the pixel, computes an average and uses that to interpolate for final pixel colour. And that's our filtering again, cool.

This technique only antialiases polygon intersections, sampling colour just once per pixel, saving large amounts of bandwidth compared to super-sampling. Here's our pixel again, with triangle depth swapped to sort of hint at what goes on. The blue dots, present the first time, are the sub-pixel depth sample points.

Because the separate sample buffer is only updated if multiple triangles share a pixel, less bandwidth is consumed than super-sampling and performance can stay high for noticeable increases in image quality. This technique, often called multi-sampling, is therefore the most popular AA algorithm implemented today, since it's cheap in terms of chip area and offers acceptable performance. Combined multi- and super-sampling can be done too, for the maximum IQ possible on your gaming-based card. Sweet!

Summary

It should be pretty simple to follow how those AA schemes work. The GPU looks inside pixels to see what's going on, as well as looking to see how far away parts of triangles inside the pixel are, in order to filter colour data and write your final pixel colour out to memory, for showing on your display. Really quite simple (at least as presented). So now when someone asks you how AA works, you know!


Sponsered by SCAN