Computergrafik und OpenGL

Computergrafik und OpenGL Dieter Orlamünder, Wilfried Mascolus Eine systematische Einführung ISBN 3-446-22837-3 Leseprobe Weitere Informationen oder B...
Author: Cornelia Dieter
1 downloads 2 Views 197KB Size
Computergrafik und OpenGL Dieter Orlamünder, Wilfried Mascolus Eine systematische Einführung ISBN 3-446-22837-3 Leseprobe Weitere Informationen oder Bestellungen unter http://www.hanser.de/3-446-22837-3 sowie im Buchhandel

1

Einfhrung

Dieses Buch enthlt wichtige Verfahren und Algorithmen der Computergrafik einschließlich ihrer praktischen Nutzung mit der Grafikbibliothek OpenGL. Die getroffene Auswahl orientiert sich deshalb vorrangig am Funktionsumfang von OpenGL und den Zusatzbibliotheken GLU (Graphics Library Utility), GLUT (Graphics Library Utility Tools) und WGL (Windows Graphics Library). Dabei gengt die Funktionalitt der Version 1.2 vollstndig, natrlich sind auch neuere Versionen voll nutzbar. OpenGL hat eine herausragende Bedeutung, weil es den gegenwrtig einzigen universellen Grafikstandard verkrpert. OpenGL ist unabhngig von speziellen Programmiersprachen definiert und kann außerdem unter den gngigen Betriebssystemen wie Windows und Linux arbeiten. Von besonderer Bedeutung fr OpenGL ist auch die Tatsache, dass alle modernen Grafikkarten OpenGL-Fhigkeiten besitzen. Dadurch knnen viele zeitkritische Grafikberechnungen auf deren Hardware ausgefhrt werden und die grafische Performance der eingesetzten Computersysteme steigt betrchtlich. Unter diesem Blickwinkel wird die Entscheidung, Delphi mit Object Pascal unter dem Betriebssystem Windows als Entwicklungsumgebung fr alle Beispiel- und bungsprojekte einzusetzen, verstndlich. Fr den Lernenden ist gerade diese Programmierumgebung zu empfehlen. Es drfte jedem Interessierten gelingen, in kurzer Zeit lauffhige Programme mit einer ordentlichen Windows-Oberflche zu erzeugen. Fr Einsteiger sei an dieser Stelle das im gleichen Verlag erschienene Buch ,,Software-Entwicklung mit Delphi“ [OrLiHu02] empfohlen. Zur Entwicklung aller Projekte dieses Buches wurde die im www frei verfgbare Version Delphi 7 eingesetzt. Hhere Versionen werden hier nicht bentigt, knnen aber natrlich ebenfalls genutzt werden. Da Delphi mit seinem Angebot an Komponenten fr die Gestaltung einer flexiblen Nutzeroberflche komfortable und umfangreiche Optionen bietet, die Orientierung des Buches aber auf die Programmierung mit OpenGL gerichtet ist, wurde ein entsprechender Prototyp bereitgestellt. Dieser ist unter der unten angegebenen Webadresse im Verzeichnis OPENGLPROJEKT enthalten. Fr den nicht so versierten Nutzer von Delphi steht damit ein komfortables Werkzeug zur Verfgung, mit dem sehr schnell Anwendungen der Computergrafik programmiert und getestet werden knnen. Natrlich lassen sich weitere Komponenten zu diesem Prototyp hinzufgen oder aus diesem entfernen. An dieser Stelle soll ein kleiner Wegweiser den Einstieg in das Buch erleichtern. Die Kapitel sind so aufgebaut, dass die vorzustellenden Algorithmen erlutert und wenn ntig auch mathematisch hergeleitet werden. Zahlreiche Beispiele sollen das Verstehen erleichtern. Hufig werden dazu direkt interessierende Programmauszge in den Text eingefgt und gleichzeitig wird auf die dazu gehrenden Projekte verwiesen. bungsaufgaben ergnzen die Kapitel und sollen den Interessierten zu eigenen Arbeiten anregen. Jedes Kapitel enthlt vor den bungen die Beschreibung der OpenGL-Routinen mit ihren Parametern. Nach dieser Einfhrung wird im Kapitel 2 die grafische Bibliothek OpenGL mit ihren Hauptkonzepten und Entwurfszielen, ihrer Architektur und den Funktionen vorgestellt.

1 Einfhrung

12

Gleichzeitig erfolgt mit dem Projekt OPENGLMINIPROJEKT ein erster Einstieg in die Programmierung mit OpenGL unter Delphi und es wird der Prototyp OPENGLPROJEKT mit mehr Komfort fr die Entwicklung der folgenden OpenGL-Projekte vorgestellt. Danach folgt Kapitel 3 mit den wichtigsten Rastergrafik-Algorithmen. Stellvertretend sollen hier das Rastern von Linien und Flchen, das Clipping, die Farbmodelle und das Antialiasing genannt werden. Kapitel 4 enthlt gngige Modellierungsverfahren, insbesondere Freiformkurven und -flchen, die Krpermodellierung und weitere spezielle Modelle. Kapitel 5 beschreibt den umfangreichen Komplex der Transformationen und Projektionen. Kapitel 6 befasst sich mit Sichtbarkeitsalgorithmen, insbesondere mit dem heute dominierenden z-Buffer-Algorithmus. Im Kapitel 7 werden die wichtigsten Beleuchtungsmodelle und -algorithmen sowie das Shading vorgestellt. Das umfasst die Lichtquellenund Oberflchenmodelle, die lokalen und globalen Beleuchtungsmodelle, Nebel und den Einfluss des Abstandes einer Lichtquelle vom Objekt. Kapitel 8 befasst sich mit den Texturen. Dabei werden die unterschiedlichen Arten vorgestellt, das Mapping von Texturen auf Oberflchen behandelt und das Antialiasing von Texturen betrachtet. Im Kapitel 9 werden Mglichkeiten zur Erzeugung bzw. Verarbeitung von Transparenz und Blending vorgestellt, ehe im abschließenden Kapitel 10 das Problem Interaktion mit OpenGL im Mittelpunkt steht. Ergnzend zu den in den Kapiteln angegebenen Programmfragmenten werden die vollstndigen Beispiel- und bungsprojekte im WWW in den Verzeichnissen BEISPIELE und UEBUNGEN bereitgestellt. Damit kann man sich besser in die vorgestellten Verfahren und Algorithmen einarbeiten. Sie knnen zugleich als Grundlage fr eigene Grafikprogramme oder fr Weiterentwicklungen dienen. Das zu diesem Buch gehrende Webangebot enthlt insgesamt • • • • •

Beispielprojekte im Verzeichnis BEISPIELE, Lsungen der bungsprojekte im Verzeichnis UEBUNGEN, fr die Entwicklung der Projekte bentigte Software im Verzeichnis OPENGL, Prototyp fr eigene OpenGL-Projekte im Verzeichnis OPENGLPROJEKT, alle Bilder des Buches im Verzeichnis BILDER.

Die URL des Webangebotes lautet http://www.inf.tu-dresden.de/ST2/cg/OpenGL-Programme/

2

Grafische Bibliothek OpenGL

2.1

Konzepte und Entwurfsziele

OpenGL (Open Graphics Library) ist eine Softwareschnittstelle (Interface) zu grafikfhiger Hardware. Die Entwicklung von OpenGL wird durch ein Architecture Review Board (ARB) gesteuert und berwacht. Diesem Gremium gehren die bedeutenden Hard- und Softwarehersteller Silicon Graphics, IBM, Hewlett Packard, SUN und Microsoft sowie weitere an. Standardliteratur zu OpenGL sind [KemFra00] und [WoNeDa00]. Zweck von OpenGL ist die Untersttzung der Darstellung von zwei- und dreidimensionalen grafischen Objekten mittels eines oder mehrerer Bildspeicher und anwendungsspezifisch weiterer spezieller Speicher. Die grafischen Objekte werden entweder durch Raumpunkte (Vertices) beschrieben oder sie bestehen aus digitalisierten Bildern (Images, Bitmaps, Pixelmaps) in Form rechteckiger Pixelfelder. Das Interface enthlt zu diesem Zweck einen umfangreichen Satz Prozeduren, Funktionen und Statusinformationen. Neben der Standardbibliothek OpenGL mit den wgl-Routinen gibt es die den Funktionsumfang bzw. den Nutzungskomfort erweiternden Bibliotheken GLU (Graphics Library Utility) und GLUT (Graphics Library Utility Tools). OpenGL basiert auf den anschließend nher beschriebenen Konzepten • • • • •

Sprachunabhngigkeit, Hardwareorientierung, einbettendes Windows-System, Client-Server-Architektur und Netzwerkfhigkeit, Zustandsautomat.

Sprachunabhngigkeit heißt, OpenGL definiert seine grafische Funktionalitt unabhngig von einer existierenden Programmiersprache. Das erfordert aber andererseits, dass fr jede reale Sprache eine spezielle Einbindung erfolgen muss. So gibt es beispielsweise fr Object Pascal oder Visual C++ zu diesem Zweck die speziellen Bibliotheken opengl32.dll und opengl32.lib. Hardwareorientierung ist im Wesentlichen einerseits dadurch charakterisiert, dass OpenGL hohe Anforderung bezglich verschiedener Buffer (Speicherblcke) stellt. Im Grenzfall sind das bis zu vier Frame Buffer (Bildspeicher) fr die Bilddarstellung, der Depth Buffer (Tiefenspeicher) fr Sichtbarkeitsentscheidungen, der Stencil Buffer (Maskenspeicher) fr die Maskierung von Speicherbereichen, der Accumulation Buffer (Akkumulationsspeicher)",4> fr den akkumulativen Bildaufbau und zustzlicher Auxiliary Buffer (Hilfsspeicher) fr Spezialaufgaben. Als Mindestanforderung mssen fr jede OpenGL-Implementierung ein Bildspeicher sowie der Depth, Stencil und Accumulation Buffer im Echtfarbmodus vorhanden sein. Ein Großteil dieser Anforderungen wird heute durch Grafikkarten untersttzt bzw. bernommen. Zur Hardwareorientierung zhlen andererseits auch die vielen so genannten Fragmentoperationen. Fragmente sind Pixeldaten, bestehend aus deren Adresse, Farbe, Tiefe und den zugeordneten Texturkoordinaten. Diese durchlaufen im Modell des OpenGL-Automaten verschiedene Stationen, an denen sta-

14

2 Grafische Bibliothek OpenGL

tusgesteuert bestimmte einfache Operationen durchgefhrt werden. Diese Abfolge von Tests und Berechnungen kann gut und effizient in Hardware umgesetzt werden. Einbettendes Windows-System ist das Synonym dafr, dass im Gegensatz zu anderen grafischen Schnittstellen fr OpenGL der Ansatz verfolgt wird, unabhngig vom Betriebssystem bzw. einer umgebenden grafischen Benutzeroberflche zu bleiben. Dies fhrt dazu, dass fr jedes umgebende System zumindest eine Minimalanpassung in Form einer gesonderten Bibliothek notwendig ist. Beispielsweise wird fr die Benutzung unter Windows die Bibliothek WGL (Windows Graphics Library) bentigt, die jedoch inzwischen integraler Bestandteil von OpenGL ist. Durch diese Entscheidung gewinnt OpenGL an Portabilitt. Allerdings muss ein solches umgebendes System existieren, um bestimmte Aufgaben, wie beispielsweise Eingaben mit der Maus oder Tastatur, zu bernehmen. Das Fenstersystem von Windows verbindet seinen Gertekontext (Device Context, DC) mit dem fr OpenGL erforderlichen so genannten Darstellungs- oder Renderkontext (Rendering Context, RC). Das hat folgende Konsequenzen: • Das Fenstersystem erzeugt die korrekte Verbindung seines Gertekontexts DC mit dem Renderkontext RC von OpenGL (Server) und seiner Anwendung (Client). • Das Fenstersystem stellt die bentigten Buffer, also mindestens einen Bildspeicher, den Depth Buffer, den Stencil Buffer und den Accumulation Buffer, bereit und organisiert die Darstellung des Inhaltes der Bildspeicher auf dem Bildschirm. • Das Fenstersystem bernimmt die Verarbeitung von Eingaben, da OpenGL dafr keine Mglichkeit besitzt. Client-Server-Architektur und Netzwerkfhigkeit charakterisiert ein Konzept, welches darauf basiert, dass die Anwendung, der Kunde (Client), seine Befehle an OpenGL, den Bediener (Server), sendet, der diese Befehle interpretiert und ausfhrt. Dabei mssen Client und Server nicht auf einem Rechner arbeiten, sondern knnen ber ein Netzwerk miteinander kommunizieren. Die Verbindung zwischen der Anwendung und OpenGL wird dabei durch das Fenstersystem organisiert. Außerdem kann ein OpenGL-Server durchaus mehrere Kunden bedienen. Voraussetzung fr die Funktionsfhigkeit dieses Konzeptes ist aber auch, dass Befehle exakt in der Reihenfolge ihres Aufrufes abgearbeitet werden, selbst wenn es Verzgerungen in deren Ausfhrung geben kann. Das bedeutet insbesondere, dass Statusabfragen konsistent den tatschlichen Status von OpenGL nach Ausfhrung aller zeitlich vorher liegenden Befehle zurckgeben und dass grafische Primitive vollstndig dargestellt werden, bevor weitere Aufrufe ausgefhrt werden. Ein Zustandsautomat ist ein Modell der Informationsverarbeitung, das auf einem internen Zustand des Systems basiert. Er interpretiert Eingaben, verndert dann den internen Zustand entsprechend und erzeugt Ausgaben. Auf OpenGL bezogen bedeutet das, Eingaben werden abhngig vom aktuellen Zustand in den Bildspeicher geschrieben und damit ausgegeben. Der interne Zustand des OpenGL-Automaten wird auch als Status bezeichnet und bestimmt den Modus der Darstellung. Er kann durch weitere Befehle ohne direkte Auswirkung auf die Ausgabe verndert werden. Der OpenGL-Zustand besteht aus einer Vielzahl von Variablen in speziellen Funktionsgruppen. Er enthlt unter anderem implementationsabhngige Grßen, wie die Tiefe des Bildspeichers in Bit, aktuelle Attributwerte, wie die voreingestellte Farbe, sowie Angaben zum Darstellungsmodus, die beispielsweise Transformationen, Beleuchtung oder das Antialiasing steuern. Alle im

2.2 Modell und Architektur

15

OpenGL-Zustand enthaltenen Statusvariablen knnen unabhngig voneinander eingestellt werden. Um einen Status oder Teile des Status zu sichern bzw. wiederherzustellen, gibt es Stapel (Stack-Speicher), auf die der Status selektiv abgelegt und von dort wieder geholt werden kann. Das ermglicht bei Bedarf gleiche Situationen zu reproduzieren. Zusammenfassend kann festgestellt werden, dass OpenGL als Softwareschnittstelle primr unabhngig von der verwendeten Hardware ist. Dadurch lassen sich Anwendungen relativ leicht auf andere Hardwareplattformen portieren. Auf der anderen Seite sollen aber Grafikkarten genutzt werden knnen, um die Darstellung zu beschleunigen. Insofern wird jede OpenGL-Implementierung auf vorhandene grafische Hardware zurckgreifen.

2.2

Modell und Architektur

Die Bilderzeugung mit OpenGL erfordert eine Reihe von aufeinander abgestimmten Operationen, beginnend bei der mathematischen Beschreibung der darzustellenden grafischen Objekte bis hin zu ihrer Ausgabe auf dem Bildschirm. Die dazu erforderlichen Schrittfolgen werden als Bildgenerierungs-, Darstellungs- oder auch als Rendering-Pipeline bezeichnet, Bild 2.1. OpenGL-Primitive, also elementare grafische Objekte wie Linien oder Dreiecke, werden durch Eckpunkte (Vertices) beschrieben, die bis zu ihrer Visualisierung, also der Ausgabe auf dem Bildschirm, die Rendering-Pipeline durchlaufen. Dabei werden bestimmte Operationen mit ihnen vorgenommen. So knnen Darstellungslisten (Display Lists) mit gespeicherten grafischen Informationen oder in bestimmten Fllen Evaluatoren (Berechner) wahlweise genutzt werden, bevor Transformationen, Projektionen, Beleuchtungsberechnungen und Clipping durchgefhrt werden. Danach erfolgt die Rasterung, die die vorhandenen Informationen in Fragmente umwandelt. Diese werden nach Durchlaufen der Fragment-Operationen, Bild 2.2, in den Bildspeicher (Frame Buffer) geschrieben, ber den die Ausgabe auf dem Bildschirm organisiert wird. Wie der Rendering-Pipeline zu entnehmen ist, knnen vor der Rasterisierung auch Image-Daten direkt oder aus Darstellungslisten eingefgt werden. Das ist vor allem bei Texturen von Bedeutung. Wie bereits weiter vorn definiert, sind Fragmente erweiterte Pixel-Daten, bestehend nicht nur aus deren Position und Farbe, sondern zustzlich aus der Tiefeninformation und den zugeordneten Texturkoordinaten. Diese Fragmente durchlaufen nun eine Reihe von Fragment-Operationen, die eine Vielzahl von Manipulationen, gesteuert durch Statusangaben, an diesen Fragmenten zulassen oder diese unverndert weitergeben. Anschließend werden die Fragment-Operationen kurz vorgestellt, ihre Anwendung erfolgt in den zahlreichen Beispielen dieses Buches. Der Scissor-Test erlaubt das Clipping an definierten Rechtecken, die normalerweise kleiner als die Darstellungsflche des Bildschirms sind. Der Alpha-Test ist nur im heute blichen RGBA-Modus zugelassen. Der Alpha-Wert des Fragments wird ber eine whlbare Vergleichsfunktion mit einem Referenzwert verglichen und nur nach Bestehen dieses Testes weitergegeben. Typische Anwendungen sind die Erzeugung transparenter grafischer Objekte oder von speziellen Texturen.

2 Grafische Bibliothek OpenGL

16

Bild 2.1

Rendering-Pipeline der OpenGL

Der Stencil-Test bercksichtigt nicht nur Fragmentdaten, sondern auch Daten des Stencil Buffer, die nach der Operation selbst verndert werden. Ein typischer Anwendungsfall ist das Maskieren bestimmter Bereiche des Bildspeichers zur Steuerung der Ausgabe einer Szene auf den Bildschirm. Der Depth-Test, blicherweise z-Buffer-Test genannt, steuert die Sichtbarkeit ankommender Fragmente durch eine whlbare Vergleichsfunktion.

2.2 Modell und Architektur

Bild 2.2

17

Fragment-Operationen der OpenGL

Der RGBA-Test wird stets ausgefhrt, da nur im RGBA-Modus das Blending, also das Mischen von Farben, zugelassen ist. Blending selbst dient zum Mischen der Fragmentund der Bildspeicherfarbe. Typische Anwendungsflle sind das Antialiasing und das berblenden zweier Bilder. Dithering ist noch ein Relikt aus der Zeit, die noch keinen Echtfarbmodus (~ 16.7 Millionen Farben) zuließ. Es sollte dazu dienen, auch mit wenigen Farben durch gezielte Verteilung derselben mglichst kontinuierliche Farbverlufe zu erzeugen. Der Color-Index-Modus basiert auf der Voraussetzung, durch geeignete Farbtabellen den Speicherbedarf zu verringern, was besonders bei der bertragung in Netzen von Bedeutung ist. Er wird heute in OpenGL selbst nur noch in Sonderfllen angewendet.

2 Grafische Bibliothek OpenGL

18

2.3

Konventionen, Konstanten, Typen, Routinen

Bezglich der Schreibweise von Konstanten, Typen und Routinen verwendet OpenGL eigene Konventionen. Diese sollten wegen der besseren Lesbarkeit eingehalten werden. Sie sind im OpenGL Reference Manual [KemFra00], [Clau97], [Burg03] angegeben. Da im vorliegenden Buch Object Pascal als Wirtssprache verwendet wird, beziehen sich die folgenden Angaben auf die dort verwendeten Begriffe und Bezeichnungen. OpenGL verwendet eine große Anzahl symbolischer Konstanten, die durch ihre Namensgebung schon auf die Bedeutung hinweisen. Diese werden prinzipiell großgeschrieben und beginnen immer mit GL_. Der Unterstrich dient zur Trennung einzelner Wortbestandteile. Es gibt Konstanten unterschiedlichen Typs. So sind die Konstanten GL_TRUE und GL_FALSE vom Typ GLboolean, whrend GL_FRONT und GL_BACK vom Aufzhlungstyp GLenum sind. Welche Konstanten im Zusammenhang mit welchen Routinen auftreten, ist dem OpenGL Reference Manual zu entnehmen. Die im vorliegenden Buch verwendeten Konstanten werden jeweils am konkreten Fall erlutert. Von OpenGL definierte Datentypen beginnen mit GL und werden dann mit Kleinbuchstaben fortgesetzt, beispielsweise GLfloat fr eine Gleitpunkt-Zahl. Sie fhrt gleichzeitig zu grßerer Kompatibilitt zwischen verschiedenen Prozessorplattformen, also zu besserer Portabilitt. Damit ist auch die Rechengenauigkeit der OpenGL festgelegt. In der folgenden Tabelle sind die OpenGL-Datentypen mit ihren Bezeichnungen, dem Inhalt, typischen Entsprechungen in Object Pascal und ihren Krzeln aufgefhrt, die fr die noch folgenden Routinen von Bedeutung sind. Datentyp

Object Pascal

OpenGL

Krzel

32-Bit-Gleitpunkt-Zahlen

float

GLfloat GLclampf

f

64-Bit-Gleitpunkt-Zahlen

double

GLdouble Glclampd

d

8-Bit-Integer-Zahlen mit Vorzeichen

shortint

GLbyte

b

8-Bit-Integer-Zahlen ohne Vorzeichen

byte

GLubyte GLboolean

ub

16-Bit-Integer-Zahlen mit Vorzeichen

short

GLshort

s

16-Bit-Integer-Zahlen ohne Vorzeichen

word

GLushort

us

32-Bit-Integer-Zahlen mit Vorzeichen

integer

GLint GLsizei

i

32-Bit-Integer-Zahlen ohne Vorzeichen

cardinal

GLuint GLenum GLbitfield

ui

Bis auf zwei Ausnahmen drften die Datentypen bekannt sein. Neu sind GLclampf und GLclampd. Diese werden fr Gleitpunkt-Parameter und -Variablen verwendet, die vor der eigentlichen Auswertung innerhalb eines OpenGL-Aufrufes auf die Wertebereiche 0 bis 1 begrenzt (to clamp) werden.

2.4 OpenGL und Windows

19

Routinen (Befehle, Anweisungen, Prozeduren, Funktionen) beginnen bei OpenGL immer mit den Kleinbuchstaben gl. Um diese von denen der anderen Bibliotheken, wie GLU, GLUT oder WGL, unterscheidbar zu machen, haben Letztere die Befehlsanfnge glu, glut oder wgl. • • • •

glLineWidth(. .) gluSphere(. .) glutSolidCone(. .) wglCreateContext(. .)

Aufruf einer OpenGL-Routine, Aufruf einer GLU-Routine, Aufruf einer GLUT-Routine, Aufruf einer WGL-Routine.

Die meisten OpenGL-Aufrufe knnen in mehreren Varianten genutzt werden: Zum einen knnen die Datentypen der Eingabeparameter unterschiedlich gewhlt werden und zum anderen kann oftmals zwischen einer nicht vektoriellen und einer vektoriellen Form unterschieden werden. Um alle Varianten in einer kompakten Form zu notieren, werden die folgenden Konventionen eingefhrt: • Der Typ der Eingabeparameter wird durch Anhngen des in der obigen Tabelle genannten Krzels an den Befehlsnamen angegeben. • Die vektorielle Form wird zustzlich mit einem v gekennzeichnet. Am Beispiel der Definition eines Vertex (Eckpunkt) mit einer unterschiedlichen Anzahl von Komponenten des Typs GLfloat sollen die verschiedenen Varianten vorgestellt werden. Die nicht vektorielle Form lautet fr einen Vertex mit 2, 3 oder 4 Komponenten vom Typ GLfloat procedure glVertex2f(x, y: GLfloat); procedure glVertex3f(x, y, z: GLfloat); procedure glVertex4f(x, y, z, w: GLfloat); und in der vektoriellen Form procedure glVertex2fv(param: PGLfloat); procedure glVertex3fv(param: PGLfloat); procedure glVertex4fv(param: PGLfloat); Hier bedeutet PGLfloat einen Zeiger auf einen Vektor vom Typ GLfloat mit 2, 3 oder 4 Komponenten. Welcher Aufruf benutzt wird, hngt von den geforderten Bedingungen ab oder wird durch den Nutzer gewhlt. Wrde es sich um Grßen des Typs GLdouble handeln, so wre statt des Krzels f (fr GLfloat) d (fr GLdouble) anzugeben usw. In diesem Buch wird vorwiegend mit dem Typ GLfloat gearbeitet.

2.4

OpenGL und Windows

Whrend Windows-Anwendungen ber den Device Context DC ihre grafischen Informationen, wie Linien, Buchstaben oder Bitmaps an das Windows-Fenster schicken, bentigt OpenGL einen zustzlichen Kontext, den Rendering Context RC. DC und RC verbinden demnach im bertragenen Sinne die OpenGL-Welt mit der Windows-Welt, mit anderen Worten, ein RC steht immer in Beziehung zu einem DC. Microsoft hat sein Betriebssys-

2 Grafische Bibliothek OpenGL

20

tem mit einigen Windows-Routinen ausgestattet, die genau diese Aufgabe ganz speziell fr OpenGL untersttzen. Hierzu existieren die bereits angesprochenen wgl-Routinen, die die ntige Untersttzung bieten, die Beziehung zwischen RC und DC herzustellen. Die wichtigsten dieser wgl-Routinen sind kurz zusammengefasst. wgl-Routine

Beschreibung

function wglCreateContext(DC: HDC): HGLRC; Erzeugung eines Rendering Context RC. function wglMakeCurrent(DC: HDC; RC: HGLRC): GLboolean; Verbinden des definierten Rendering Contexts RC mit dem Device Context DC. function wglGetCurrentContext: HGLRC; Ermittlung des gerade gltigen Rendering Context RC. function wglGetCurrentDC: HDC; Ermittlung des Device Context DC, der in Beziehung zum Rendering Context RC der OpenGL-Anwendung steht. function wglDeleteContext(RC: HGLRC): GLboolean; Lschen des spezifizierten Rendering Context RC.

HDC und HGLRC sind in Windows definierte spezielle Typen. Bevor die wglCreateContext-Routine ausgefhrt werden kann, mssen bei der Initialisierung gewisse Eigenschaften des DC angepasst werden. Diese werden mittels einer speziellen PIXELFORMATDESCRIPTOR-Struktur OpenGL-spezifisch ausgelegt. Die zu diesem Zeitpunkt vorhandene PIXELFORMATDESCRIPTOR-Struktur besitzt nur Initialisierungswerte, die fr normale Windows-Fenster sinnvoll sind. Hier werden aber spezifische Angaben fr ein OpenGL-konformes Fenster bentigt. Die PIXELFORMATDESCRIPTOR-Struktur hat spezielle Komponenten, von denen anschließend einige mit ihrem Typ und der Bedeutung genannt sind. Es wrde den Rahmen dieses Buches sprengen, die Bedeutung jedes einzelnen Elements der Struktur des PIXELFORMATDESCRIPTOR vollstndig aufzufhren. Deshalb wurden nur ein paar fr OpenGL wichtige Elemente genannt. Diese werden als Parameter in der Routine CreateRenderingContext(. .) gesetzt. Die in diesem Buch verwendete Unit OpenGL12 ist im WWW unter der Adresse http// www.soft.gems.net/Graphics.php verfgbar. Dort befinden sich weitere interessante Informationen zum Problemkreis OpenGL und Delphi. In OpenGL12 selbst wurden die fr die Nutzung von OpenGL unter Delphi mit Windows erforderlichen und anschließend angegebenen Routinen definiert und implementiert. • Initialisieren von OpenGL function InitOpenGL: Boolean; Kurzbeschreibung InitOpenGL ldt alle bentigten Dateien OpenGL32.dll und GLU32.dll sowie die Adressen der Standardroutinen. Ist OpenGL bereits initialisiert, so hat der Aufruf keine Wirkung.