home *** CD-ROM | disk | FTP | other *** search
- 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
-
-