MagnaMedia · AMIGA-Magazin · CyberGL

Aktuelles Heft 5/97

CyberGL: Workshop (Folge 2)

In den Weiten des Raums

Nachdem im letzten Teil die angebotenen Grafikbibliotheken im allgemeinen und die grunds�tzlichen Eigenschaften der OpenGL im speziellen beleuchtet wurden, schaffen wir in diesem Kursteil das Basiswissen zur Nutzung der CyberGL.

von Frank Gerberding

Zun�chst zu den Voraussetzungen, die erf�llt sein m�ssen, bevor die CyberGL zum Einsatz kommen kann. F�r die offiziellen OpenGL-Spezifikationen (s. [1]) mu� die CyberGL sehr genaue und teilweise sehr aufwendige Berechnungen durchf�hren. Daher ist eine Flie�kommaeinheit (FPU) zwingend erforderlich � es wird also mindestens ein 68020-68882-Gespann ben�tigt, besser jedoch in Kombination mit einem 68040- oder 68060-Prozessor. Au�erdem sollte m�glichst der Hauptspeicher gut ausgebaut sein. Beispiel: ein einfaches Programm braucht, um ein Fenster mit der Gr��e 600x450 Pixel zu zeichnen, schon ca. 1 MB Hauptspeicher. Das alles, um den Fensterinhalt, den Z-Buffer, interne Buffer, Tabellen, den CyberGL-Kontext und nicht zuletzt die Bibliothek und das Programm selbst aufzunehmen. Da CyberGL in erster Linie f�r dreidimensionale, beleuchtete Szenen designed wurde, sind nat�rlich eine Grafikkarte oder mindestens ein AGA-Chipset n�tig, um die sehr gro�e Anzahl von Farben vern�nftig darzustellen.

Beleuchtungsfunktionen
GLvoid glMaterialfv (GLenum face, GLenum pname, GLfloat *params);
GLvoid glLightfv (GLenum light, GLenum pname, GLfloat *params);

Die Bibliothek

Sind alle diese Hardware-Voraussetzungen erf�llt, fehlt nat�rlich noch die Software: In erster Linie ist die Bibliothek selbst n�tig, also die �cybergl.library�. Sie mu� sich in der richtigen Version (68030+ 68882, 68040 oder 68060) im Verzeichnis �LIBS:� befinden. Da die OpenGL einige Funktionen beinhaltet, die sehr viele Parameter und oft auch Flie�kommaparameter doppelter Genauigkeit erwarten und damit mehr Register ben�tigt werden, als vorhanden sind, ist es leider n�tig, einige CyberGL-Funktionen durch eine kleine Link-Bibliothek (�cybergl.lib�) anzupassen. Diese kleine Bibliothek ist nicht zwingend erforderlich, allerdings k�nnen wir dann einige Funktionen (z.B. glOrtho) nicht wie gewohnt aufrufen, sondern es mu� zun�chst eine Struktur mit den Funktionsparametern gef�llt werden und die Funktion erh�lt dann einen Zeiger auf diese Struktur. Neben diesen Bibliotheken sind nat�rlich die Headerdateien n�tig, um ein CyberGL-Programm zu �bersetzen. Sollte sogar CyberGfX V3.0 verf�gbar sein, ist eine Truecolor-Darstellung mit 16 Mio. Farben m�glich � ohne CyberGfX 3.0 mu� man mit maximal 256 Farben auskommen, die aber von der CyberGL so gut wie m�glich ausgenutzt werden.

Sicht: Verh�ltnis zwischen Breite
und H�he des Bildes,
vertikaler Kamera�ffnung und
Front- und Back-Clipping-Plane
Test: Dieses Dreieck wird durch
das Programm in Listing 1 erzeugt

Wie sieht nun ein einfaches CyberGL-Programm aus? Im Prinzip funktioniert die Benutzung der CyberGL genauso wie die der �graphics.library�: Es wird ein Fenster ge�ffnet, in das anschlie�end gezeichnet werden kann und am Ende des Programms wird das Fenster wieder geschlossen. Die Funktionen zum �ffnen und Schlie�en eines CyberGL-Fensters gleichen sogar den Funktionen der �intuition.library� � im Grunde sind es die Funktionen der intuition.library erg�nzt um einige entscheidende Kniffe. Die Funktion zum �ffnen eines CyberGL-Fensters hei�t �openGLWindowTagList� bzw. �openGLWindowTags� f�r die Stack-Version). Sie erwartet als Argumente die Breite und H�he des Fensters und eine Tag-Liste. Die Funktion zum Schlie�en eines CyberGL-Fensters hei�t �closeGLWindow�. Sie erwartet lediglich das zuvor ge�ffnete Fenster als Argument. Da ein CyberGL-Window ein abstrakter Datentyp ist, dessen Inhalt dem Benutzer verborgen bleibt, braucht man zus�tzlich noch die Funktion �getWindow�, um an das zugeh�rige Intuition-Fenster zu kommen. Diese Funktion erwartet ein CyberGL-Fenster als Parameter und liefert einen Zeiger auf das Intuition-Fenster, um etwa auf Messages zu reagieren (Tastendruck, Mausklicks usw.). Eine weitere wichtige Funktion hei�t �resizeGLWindow� � sie teilt der CyberGL mit, da� sich die Fenstergr��e ge�ndert hat. Dies ist n�tig, da die CyberGL nicht automatisch von Intuition �ber eine Gr��en�nderung informiert wird. Ein �berblick �ber diese vier wichtigen Funktionen ist in unserem Infokasten �Funktionen� zu finden.

Ein einfaches Beispiel

Ein einfaches Beispiel demonstriert das Listing 1 � das Ergebnis dieses kleinen Programms ist in Bild �Test� zu sehen. Immer nur in ein Fenster mit Weltkoordinaten zwischen (-1.0,-1.0,-1.0) und (1.0,1.0,1.0) zu zeichnen �det nat�rlich auf die Dauer ziemlich an. Gl�cklicherweise bietet die CyberGL einige Funktionen, um auf einfache Weise verschiedene Parallel- und Zentralprojektionen in die Projektionsmatrix zu laden, die dazu zuerst einmal per �glMatrixMode (GL_PROJECTION)� zur aktuellen Matrix gemacht werden mu�. Nun kann z.B. mit glOrtho (-400.0, 400.0, -300.0, 300.0, 500.0, -500.0) eine Parallelprojektion erzeugt werden, die den Punkt (-400.0, -300.0, 500.0) auf die linke, untere, vordere Ecke des Fensters und den Punkt (400.0, 300.0, -500.0) auf die rechte, obere, hintere Ecke des Fensters abbildet. Nun erscheint es vielleicht merkw�rdig, von einer �vorderen Ecke des Fensters� zu reden, schlie�lich ist ein Fenster doch nur zweidimensional. Allerdings schneidet die CyberGL Fl�chen nicht nur an den Fenstergrenzen ab, bevor sie gezeichnet werden, sondern zus�tzlich an einer vorderen und hinteren Ebene (Front- und Back-Clipping-Plane). Solche Parallelprojektionen sind zwar f�r technische Anwendungen recht n�tzlich, aber das menschliche Auge wei� immer nicht so recht was denn nun vorn und was hinten sein soll, da Objekte in der Realit�t mit zunehmender Entfernung kleiner werden. Darum gibt es weitere Funktionen zum Laden von Zentralprojektionen. Eine davon hei�t �glPerspective� und erwartet den vertikalen �ffnungswinkel der virtuellen Kamera, das Seitenverh�ltnis des Fensters und die Entfernungen zur Front- und Back-Clipping-Plane. Zum besseren Verst�ndnis werfen wir einen Blick auf die Abbildung �Sicht�. Dargestellt ist der sogenannte Sichtpyramidenstumpf, der durch den Augenpunkt (die Position der virtuellen Kamera), das Verh�ltnis zwischen Breite und H�he des Bildes (z.B. 4:3 = 1.333), den vertikalen Kamera�ffnungswinkel (z.B. 40.0 Grad) und die Entfernungen zur Front- und Back-Clipping-Plane (z.B. 0.5 und 50.0) eindeutig definiert ist � das ergibt den Aufruf "glPerspective (40.0, 1.333, 0.5, 50.0)".

CyberGL-Funktionen
GLvoid *openGLWindowTagList (GLint width, GLint height, struct TagList *tags);
GLvoid closeGLWindow (GLvoid *window);
struct Window *getWindow (GLvoid *window);
GLvoid resizeGLWindow (GLvoid *window, GLint width, GLint height);

Nun fehlt f�r eine flexible Sichtdefinition nur noch die M�glichkeit, die Kamera beliebig im virtuellen Raum zu positionieren und auf irgendein Objekt auszurichten. Diese Aufgabe �bernimmt die CyberGL-Funktion �glLookAt�. Zuerst wird dazu aber via �glMatrixMode (GL_MODELVIEW)� auf die Modelview-Matrix umgeschaltet, da es sich bei der Kameradefinition um keine Projektion handelt. �glLookAt� erwartet als Argumente die Position der Kamera, den Punkt, auf den die Kamera ausgerichtet ist und einen Vektor, der angibt wo �oben� ist � im n�chternen Zustand au�erhalb eines Flugzeuges sind das meistens die Koordinaten (0.0, 1.0, 0.0). Der Beispielaufruf "glLookAt (4.0,6.0,15.0, 0.0,-1.0,-2.0, 0.0,1.0,0.0)" definiert als Kameraposition den Punkt (4.0,6.0,15.0), als Blickziel den Punkt (0.0,-1.0,-2.0) und als �oben� die Richtung (0.0,1.0,0.0).

W�rfel: Das Objekt mit Beleuchtung durch Listing 2 � Sie finden es auf den Internetseiten des AMIGA-Magazins

Primitive-Beschreibung

Im letzten Teil des Kurses wurde bereits angek�ndigt, da� es zehn Arten von Primitiven gibt, die in �Primitive� zu sehen sind. Eigentlich gibt es nur Punkte, Linien, Dreiecke, Vierecke und n-Ecke. Aber wie in der Abbildung zu sehen, sind einige sehr n�tzliche Varianten m�glich. Diese machen teilweise mehrfache Aufrufe von glVertex f�r Punkte, die von mehreren Primitiven gemeinsam benutzt werden, �berfl�ssig. Die CyberGL setzt mehrere glVertex-Aufrufe auf v�llig unterschiedliche Arten zu Primitiven zusammen � je nachdem welches Argument die Funktion �glBegin� erh�lt.

Primitives: CyberGL unterst�tzt die Darstellung dieser zehn Objekte
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <intuition/intuition.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#define SHARED                  /* shared library benutzen */
#define GL_APICOMPATIBLE        /* stubs aus cybergl.lib benutzen */
#include "cybergl.h"            /* cybergl Datentypen */
#include "cybergl_protos.h"     /* cybergl Prototypen */
#include "display.h"            /* cybergl Fensterfunktionen */
#include "cybergl_pragmas.h"    /* cybergl Pragmas */

extern struct Library *CyberGLBase;   /* cybergl Library Base */

#define WIDTH  400              /* Fensterbreite */
#define HEIGHT 400              /* Fensterh�he */

void main (int argc, char *argv[])
{
  void *glWindow;               /* unser cybergl-Fenster */

  glWindow = openGLWindowTags (WIDTH, HEIGHT,  /* Fenster �ffnen */
    GLWA_Title,       "Test",                  /* Titel */
    GLWA_DragBar,     TRUE,                    /* Ziehbar */
    GLWA_CloseGadget, TRUE,                    /* Schlie�button */
    GLWA_IDCMP,       IDCMP_CLOSEWINDOW,       /* Messages */
    GLWA_RGBAMode,    GL_TRUE,                 /* CyberGL RGBA-Mode */
  TAG_DONE);

  if (glWindow)                                /* Fenster ge�ffnet ? */
  {
    /* Framebuffer (RGBA) und Z-Buffer l�schen */
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin (GL_TRIANGLES);       /* Primitiv: Dreiecke */
      glVertex2d (-0.9, -0.9);    /* erste Ecke */
      glVertex2d ( 0.9, -0.7);    /* zweite Ecke */
      glVertex2d (-0.6,  0.9);    /* dritte Ecke */
    glEnd   ();                   /* Fertig ! */

    /* auf Closebutton warten */
    Wait (1 << getWindow (glWindow)->UserPort->mp_SigBit);
    closeGLWindow (glWindow);     /* Fenster schlie�en */
  }
}

Listing 1: Diese Programm �ffnet ein Fenster und zeichnet ein Dreieck per CyberGL

Die Beleuchtung

F�r eine einfache �richtig dreidimensionale� Szene fehlt nun eigentlich nur noch: die Beleuchtung. Da die CyberGL in diesem Punkt eine F�lle von M�glichkeiten und Funktionen bietet, wollen wir uns daher auf das Wesentliche beschr�nken. Die wichtigsten Funktionen f�r eine einfache Beleuchtung finden Sie im Info-Kasten �Beleuchtungs-Funktionen�. Die erste der beiden Funktionen erlaubt es, Materialattribute zu definieren. Wir beschr�nken uns auf die Vorderseiten von Polygonen (die R�ckseiten sind bei statischen Darstellungen schlie�lich sowieso nicht sichtbar) und setzen daher das Argument �face� auf �GL_FRONT� und ver�ndern nur die diffuse Farbe des Materials � �pname� wird also auf �GL_DIFFUSE� gesetzt. Das letzte Argument f�r diese Funktion mu� nun ein Zeiger auf vier (ja vier) Flie�kommawerte sein, die die Farbe bestimmen. Die CyberGL verarbeitet intern alle Farben im RGBA-Format (Rot, Gr�n, Blau, Alpha), wobei jeder der Werte zwischen 0,0 und 1,0 liegen kann. Der Alpha-Kanal wird zwar von der aktuellen CyberGL-Version nicht verwendet, sollte aber trotzdem immer auf 1.0 gesetzt werden. Die zweite Funktion kann diverse Lichtquellenparameter einstellen, aber auch hier beschr�nken wir uns auf die wichtigsten. Wir verwenden genau eine Richtungslichtquelle (vergleichbar mit Sonnenlicht), die wei�es Licht auf unsere Szene fallen l��t. Die Lichtrichtung wird durch einen Punkt angegeben, von dem aus das Licht in Richtung Nullpunkt � also (0.0,0.0,0.0) strahlt. Etwas ungew�hnlich mag die Darstellung des Vektors in vier Dimensionen erscheinen, wie es im Programm zu sehen ist. Dies liegt daran, da� f�r alle Punkte und Vektoren sogenannte homogene Koordinaten verwendet werden. Im Grunde reicht es zu wissen, da� die vierte Koordinate (auch w-Koordinate genannt) normalerweise 1.0 sein sollte, au�er im Fall von Richtungsvektoren (wie hier bei der Richtungslichtquelle), wo sie den Wert 0.0 haben mu�. Mit all diesem Wissen ausgestattet, k�nnen wir nun ein kleines CyberGL-Programm schreiben, das ein Fenster �ffnet, einige Einstellungen vornimmt und dann einen beleuchteten W�rfel darstellt (Listing 2). Nach diesem Kursteil haben wir das n�tige R�stzeug, um in der n�chsten Folge ein etwas komplexeres CyberGL-Programm zu verstehen. Dann wollen wir n�mlich einen Fraktalgebirge-Generator schreiben, der seine Ausgaben in einem CyberGL-Fenster realisiert.
lb
Beleuchtung: Die Erzeugung dreidimensionaler Objekte mit Lichteffekten unterst�tzt CyberGL auf Wunsch

Literatur:
[1] The OpenGL Graphics System: A Specification (Version 1.0), Mark Segal, Kurt Akeley, 8.Oct 1993
[2] OpenGL Programming Guide, Addison Wesley Publishing Company, ISBN 0-201-63274-8


MagnaMedia Hauptseite

� Copyright by MagnaMedia Verlag AG, Haar bei M�nchen
Ver�ffentlichung und Vervielf�ltigung nur mit schriftlicher Genehmigung des Verlags


Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 15.April 1997.