home *** CD-ROM | disk | FTP | other *** search
-
- What is ANTIALIASING?
-
- Everything you see on your computer monitor is the illumination of pixels
- (dots, that is) in various patterns. These dots, however, are not infinitely
- small, and therefore, if you are drawing lines, circles, or any polygons with
- edges, you will notice jaggies. Jaggies (or staircasing), is an inevitable
- by-product of approximating these smooth surfaces on a grid... and the lower
- the resolution of your display (or coarser the grid), the worse the problem.
-
- Well, since higher resolution reduces the problem, why not have displays
- with resolutions of 1,000,000 x 1,000,000 , instead of the measly 640 x 400
- or 320 x 200 resolutions we have on the Amiga? One awfully good reason is
- that whenever you double the resolution of a computer, the amount of memory
- the display takes up is quadrupled. That starts to get rather costly. Also,
- one of the reasons our computers and monitors are so reasonably priced is
- that they use hardware that is mass produced for television, which is about
- 640 x 482 pixels of resolution, in the US. Go much beyond that, and you'd
- better be rich to afford the monitors and display circuitry.
-
- So what to do? Fortunately, higher resolution isn't the correct approach.
- No matter how fine your grid is, there are certain kinds of images that are
- sure to produce nasty artifacts, such as the classic "checkerboard floor
- extending to infinity". You will start to get fascinating, but unwanted
- moire patterns.... trust me. The best way to deal with the dreaded jaggies
- is - ANTIALIASING! But to do antialiasing, you need colors. Lots of them.
- Sorry. On the Amiga, you can fake it though, and that is what I've done for
- this demo/tutorial. Colors are cheaper (in terms of memory) than pixels, and
- we should bow our heads with gratitude that this is the case.
-
- I know that people sing rhapsodic praise about the wonders of Amiga graphics,
- and I'm one of them, as far as it goes.... but effective anti-aliasing really
- seperates the 'adults from the children'. You not only need to have lots of
- colors, but you want to know where they are fast! What we are effectively
- doing is blending colors together- blurring the edges, as it were. The more
- colors you have between any color you may wish your line/circle/polygon to be,
- and what color(s) you are writing it on, the better. Fortunately, we live in
- times in which the price of framebuffers is plummeting. I know of one
- manufacturer who will be marketing a 32,000 color (all on the screen at
- once) frame buffer for about $1500, for the IBM PC. We can expect to see
- similar technology in the Amiga universe shortly, I would wager.
-
- For those of you with limited patience, or limited budgets, who wish to
- enter the exciting world of programming anti-aliased graphics, I humbly
- provide this code, which plots concentric circles, in 320 x 200, both
- anti-aliased and normally. You won't have to ask which is which. I get
- around the requirement for a zillion colors by filling the 16 color map
- with a range of intensities of yellow to black, so it only draws yellow
- figures on a solid black background, or vice-versa. But you'll get the
- idea.
-
-
- How does ANTI-ALIASING work?
-
- I'm glad you asked. A common way of drawing lines or circles involves
- the use of something called a DDA, or Digital Differential Analyzer (or
- something like that). What this means is, you keep track of when to
- increment (or decrement) your 'X' coordinate (or 'Y'), depending on the
- value of a "remainder" variable, which we'll conventionally call 'R'.
-
- Here's a simple example:
-
- line(x1,y1,x2,y2)
- int x1,y1,x2,y2;
- {
- int dx, dy;
- int r;
-
- dx = x2-x1;
- dy = y2-y1;
- r = (dx-dy)/2
- while (x1<=x2)
- {
- x1 = x1+1;
- r = r+dy;
- if (r>=dx)
- {
- r=r-dx;
- y1=y1+1;
- }
- Draw_a_Dot(x1,y1);
- }
- return;
- }
-
- (For simplicity, this routine will only plot lines between 0 + 45 degrees -
- it can be adapted for all lines, at your leisure.)
-
- Lets say you want to draw a line from 10,10 (x,y) to 70,20.
- The change (delta) of X is 60 (call this DX), the delta of Y (DY) is 10.
- For the hell of it, we initialize the remainder, R, to half of DX-DY (or 25).
- We keep adding DY to R (while incrementing X, and drawing dots at (X,Y)),
- until R exceeds DX, at which time we subtract DX from it, and increment Y.
-
- In our example it would look like this:
-
- X Y R R/DX
- 11 10 35 .58
- 12 10 45 .75
- 13 10 55 .92
- 14 11 5 .08
- 15 11 15 .25
- 16 11 25 .42
- 17 11 35 .58
- 18 11 45 .75
- 19 11 55 .92
- 20 12 5 .08
- ... ... ... ...
-
- Now here's where the anti-aliasing comes in: the DDA's 'R' can be pressed into
- double duty by thinking of its relationship to DX as a PERCENTAGE of coverage
- of a pixel by the line. In other words, assuming a line of one pixel thickness,
- 58% of the pixel at (11,10) is "covered" by that line, so by interpolating
- the color of the line and the color of the pixel by 58%, you get the color you
- should paint there! If the pixel is color 0 (black) and the line is color 15
- (yellow), color 8 (medium yellow) should be painted there. If 58% of the
- pixel is covered, and the line is one pixel thick, where is the other 42% of
- that line? At (X,Y-1), since our line is going "up", the trailing edge is
- "under". So you paint a "trailing edge" of that line at 42% yellow (color 6)
- interpolated with backround color. Do this for each point you plot, and
- voila, you have an anti-aliased line. Congratulations.
-
- [ interpolation: getting the difference between two values, multiplying that
- difference by a percentage, and adding it back in to the first value. i.e.
- a 10% interpolation between 10 and 50 is 14 ((50-10)*.10)+10) ]
-
- Antialias.c uses this method with a circle drawing DDA.... due to the
- aspect ratio of the pixels, the circles aren't round, but you can easily
- fix that yourselves, if you have a yen to.
-
- At this point, I wish to acknowledge my indebtedness to Mike Higgens,
- who published this method of anti-aliasing edges quickly, using integer math.
- He was my colleague at Time Arts, and for years I will be rediscovering
- things that he's already forgotten.... Thanks Mike!
-
- You can leave comments, gripes, questions, and blonde virgins to me
- at AMIC or CIS # 73267,2124.
-
- Miles Keith Kurland
- The Programmer General
-
- "Warning! The Programmer General has determined that
- failure to back up your hard disks may result in
- lost data, acute anxiety, and random acts of violence"
-