Glide-Tutorial - Teil I Hier ist also Teil I meines "Programmin the 3Dfx"-Kursus. Vorab folgende Infos: Um mitzucoden ben”tigt man den Watcom C++ Compiler (Ver.10.5a, allerdings hab ich's auch mit Ver.10.0 ber den alias-Befehl hingekriegt) fr DOS oder den MS-Visual C++ (Ver.5.0) fr Win9x. Laut root soll es aber auch mit GNU-C unter Linux gehen. Was man zus„tzlich ben”tigt, ist das Glide-SDK, das es kostenlos unter www.3dfx.com gibt. Dort stehen verschiedene Pakete zur Auswahl. Zun„chst w„hlt man zwischen Glide3 und Glide2. Ich habe mich in meinem Kursus fr Glide2 entschieden, da man mit Glide3 (zur Zeit ?) nur unter Win9x coden kann :( Im n„chsten Men braucht man eigentlich nur das eigentliche SDK ziehen, da die (auch seperat erh„ltlichen) Doku-Files bereits beiliegen. Die auch angebotenen Utilities beinhalten z.B. ein Konvertierungs-Prog fr Texturen (fr mich das wichtigste Tool), verschiedene Diagnostik-Progs und kompilierte Beispiele. Bevor wir loslegen noch folgendes: "SST" ist die interne Bezeichnung fr 3Dfx-Karten. Also, auf gehts mit der Initialisierung... #include #include void main(void) { GrHwConfiguration hwconfig; unsigned char Str[80]; unsigned long v; if (!grSstQueryBoards(&hwconfig)) { printf("Keine 3Dfx-Karte(n) gefunden"); return; } grGlideInit(); // Initialisierung grSstQueryHardware(&hwconfig); // Infos einholen printf("3Dfx-Karten: %i \n",hwconfig.num_sst); for (v=0; v #include #include void PixelGlide(GrVertex Vektor, unsigned char Rot, unsigned char Gruen, unsigned char Blau, unsigned char Alpha) { grConstantColorValue(Rot | Gruen<<8 | Blau<<16 | Alpha<<24); grDrawPoint(&Vektor); } void LineGlide(GrVertex Vektor1, GrVertex Vektor2, unsigned char Rot, unsigned char Gruen, unsigned char Blau, unsigned char Alpha) { grConstantColorValue(Rot | Gruen<<8 | Blau<<16 | Alpha<<24); grDrawLine(&Vektor1,&Vektor2); } void main(void) { GrVertex Vektor[3]; grGlideInit(); grSstSelect(0); grSstWinOpen(NULL,GR_RESOLUTION_640x480,GR_REFRESH_60Hz,GR_COLORFORMAT_ABGR,GR_ORIGIN_UPPER_LEFT,2,0); Vektor[0].y=Vektor[0].x=100; Vektor[1].y=Vektor[1].x=400; Vektor[2].y=Vektor[2].x=50; guColorCombineFunction(GR_COLORCOMBINE_CCRGB); // Farbmodus=ConstantColor grBufferClear(0,0,0); // GrafikBuffer loeschen PixelGlide(Vektor[2],255,0,0,255); LineGlide(Vektor[0],Vektor[1],255,255,255,255); grBufferSwap(1); // GrafikBuffer anzeigen while (!kbhit()) {} grGlideShutdown(); } Das Proggie zeichnet eine weisse Linie und einen roten Punkt. Die Punkte werden dabei durch folgende Strukturen wiedergegeben: typedef struct { float sow; // Textur-X-Koordinate float tow; // Textur-Y-Koordinate float oow; // fr MipMapping } GrTmuVertex; typedef struct { float x, y, z; // Koordinaten (Z wird ignoriert) float r, g, b; // Farbwerte fr Shading float ooz; // fr Z-Buffering float a; // Alpha(Transparenz)-Wert float oow; // fr Texturen GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; } GrVertex; Zun„chst interessieren uns dabei nur die Koordinaten-Werte, den Rest werde ich dann nach und nach erl„utern. Zurck zu meinem Bsp-Proggie: Nach der Initalisierung wird mit guColorCombineFunction() (sie benutzt die Low-Level-Funktion grColorCombine()) die Art der Farbberechnung gew„hlt, z.B. Konstante Farbe (Flat Shading) (GR_COLORCOMBINE_CCRGB), Gouraud Shading (GR_COLORCOMBINE_ITRGB), Normalo-Texture-Mapping (GR_COLORCOMBINE_DECAL_TEXTURE) usw. In unserem Falle gengt uns ein stinknormaler Farbwert, den man dann mittels grConstantColorValue() setzen kann. Bei diesem Farbmodell werden brigens die r,g,b,a Werte in GrVertex einfach ignoriert. Die Funktionen PixelGlide() & LineGlide() abstrahieren das Ganze, indem sie die Farbwerte entgegen nehmen und dann selbstst„ndig setzen. Bevor wir aber munter draufloszeichnen, mssen wir erstma den Grafikbuffer l”schen. Dies geschieht mittels grBufferClear(), dem man zuerst die Fllfarbe mitteilt (wiederum im Format BGR), dann den Standard-Alpha-Wert und den Standard-Z-Buffer-Wert. Da wir die beiden letzteren noch nicht ben”tigen, bergeben wir einfach 0. Jetzt wird gezeichnet und anschliessen der GrafikBuffer angezeigt (grBufferSwap() - bergeben wird hier die Anzahl der Retraces, die dazu abgewartet werden. 1 erm”glicht eine flackerfreie Darstellung, w„hrend 0 (meist) h”here Frame-Zahlen zur Folge hat). Carsten aka Toxic Avenger/Ainc.