113 lines
6.1 KiB
Plaintext
113 lines
6.1 KiB
Plaintext
Gouraud Vectors
|
|
by
|
|
Tumblin / Bodies In Motion
|
|
================================
|
|
|
|
Hi there everybody. I'm back with another source code release, and
|
|
this time its on gouraud shading. Actually I learned how to do gouraud
|
|
shading when I was at NAID '95. (Incidentally, try checking out squ.zip,
|
|
Squishtro by Dungeon Dwellers Design's production for the intro competition
|
|
at NAID... there is a picture of me getting squished all around with a coding
|
|
carrot in my mouth! hahahahah, long story :)
|
|
|
|
Anyway, I am not going to try to describe how to do the 3d polygon
|
|
stuff that you see on the screen... it would take too long, so I will just
|
|
try to explain a little bit about the gouraud shading algorithm. Lets get
|
|
started.
|
|
|
|
Gouraud shading is a multiple step process. When you call a routine
|
|
that would draw a gouraud shaded triangle, you pass the x, y, and color of
|
|
all three tips of the triangle. Now, with this information you have to trace
|
|
each of the three edges and record the coordinates and the color information
|
|
along the way. What you are trying to do is interpolate from color A to
|
|
color B. The way you do this is you calculate the amount of change in color
|
|
divided by the amount of change in the distance you have to trace the edge.
|
|
This will give you something similar to the slope of a line, only you are
|
|
dealing with color rather than just plain x's and y's. What you do with the
|
|
slope is you add it to your screen coordinate and when it comes time to
|
|
record the information, truncate off the fractional part. You can do this by
|
|
using floating point (as I have used in my source code, because I was a
|
|
little lazy) or fixedpoint. I didn't bother to optimize the routine because
|
|
it would just get in the way of learning how the algorithm works, which is
|
|
my purpose for releasing this anyway (:
|
|
|
|
After you have all three edges of the triangle traced and the
|
|
coordinates, and color information are recorded for each scanline
|
|
(horizontally or vertically, your choice... I chose to fill my scanlines
|
|
horizontally in the source code that I have included here), you have to fill
|
|
between one edge of the scanline and the opposite edge of the scanline. The
|
|
filling is again done the same way as above, only you actually draw the point
|
|
rather than record it into a buffer.
|
|
|
|
Once you have all of the scanlines filled, you have drawn a gouraud
|
|
shaded triangle! Of course you could take this many steps further and create
|
|
a routine that draws arbitrarily sided polygons, or many other interesting
|
|
things.
|
|
|
|
Okay, so how do you come up with the color of the vertices of the
|
|
polygons you are trying to draw? Well, in my code I did a simple little
|
|
hack that not entirely correct, but still produces some funky gouraud shaded
|
|
objects (: What I did was take each vertex in the object and multiply it by
|
|
2 to generate vertex normals. Then when I spin the object around, I also
|
|
spin the normal vertices around as well. When it comes time to draw the
|
|
polygons, I take the dot product of the vertex normals and the light source
|
|
and calculate a color with a little formula. This is the same idea as
|
|
lambert shading, only you apply it to each vertex normal, rather than to the
|
|
one normal for the whole polygon.
|
|
|
|
I hope this becomes more clear when you look at the source code. Oh,
|
|
I thought I might let you know that I use a tab setting of 2 in all my source
|
|
code, so you may want to set your editor's tab setting to match it.
|
|
|
|
Here are some tips to get it to compile:
|
|
- Unzip all the files from this release into a directory
|
|
- Open a project file (I used Turbo C++ 3.0 to compile the demo)
|
|
- In the project file, include gvectors.cpp, fixedl.asm, and xlib61l.lib
|
|
- Make sure that you have the compiler set to the LARGE memory model
|
|
- One thing that I did with the way I organized my copy of the XLIB library
|
|
was that I copied all the *.h files into the directory I made called
|
|
c:\tc\xlib61, then I added it to compiler's include and link directories
|
|
in the Options/Directories menu. This allows me to simply put
|
|
#include <xlib_all.h> at the top of my programs, rather than having all
|
|
those *.h files cluttering up my source code directory. I still copied
|
|
the xlib61l.lib file to my source code directory however. Works out great!
|
|
- That should do it (: If you have any problems, just email me.
|
|
|
|
|
|
The V10 objects were all created in my vector editor called
|
|
VED v1.0, which I released at NAID'95. Here's where you can find it:
|
|
ftp.cdrom.com:/pub/demos/code/utils/ved10.zip
|
|
|
|
The gvectors.h file which contains all the palette data was created
|
|
by my PCX to C++ source code convertor. You can find that on:
|
|
ftp.cdrom.com:/pub/demos/code/images/pcx2csrc.zip. I used Deluxe Paint to
|
|
create a PCX file with the color number range 16 to 96 to be bright red to
|
|
black. Then I deleted the information about the bitmap at the top of the
|
|
file and renamed the palette buffer for this program. Quite a useful
|
|
little utility I wrote!
|
|
|
|
|
|
I guess I'll wrap up this text file with some greets, so here they go:
|
|
Dungeon Dwellers Design - Thanks for squishing my face at NAID! hehe.
|
|
CORE - Your demo has been an inspiration to me. Thanks for letting me hang
|
|
with you guys at NAID.
|
|
Ronski - glad to hear that you're alive and well, give me a ring more often!
|
|
Necros - too bad I didn't get to meet you, but saw you on the big stage...
|
|
congratulations for your sucess at NAID'95, I loved your song!
|
|
Boggart - thanks for showing me your code and for explaining gouraud shading
|
|
Voltaire - your release on gouraud shading helped a lot in making this
|
|
MikMak - I like your music system, very nice
|
|
Complex - your DOPE demo rocks (:
|
|
Everyone I talk to on IRC in #coders :
|
|
ae, johnson, fYSx, ReDDoG, anixter, MrBeach, Kodiak, Addict, Snowman, ior,
|
|
Hasty, and Lord Logics.
|
|
|
|
|
|
Have fun with the code and we might have some more sources for ya in the
|
|
not too distant future. Until then, keep on coding, and keep on eating your
|
|
coding carrots!
|
|
|
|
Tumblin / Bodies In Motion '95
|
|
tumblin@mi.net
|
|
|