24 Verschiedenes
24.010 Wie kann ich ein Drahtgittermodell zeichnen, allerdings ohne die verdeckten Linien ?
Die bevorzugte Methode ist, die gewünschte Geometrie in zwei Durchgängen
zu zeichnen: Zuerst im Fill Mode mit der Farbe des Hintergrunds und dann danach
mit einer geeigneten Farbe im Drahtgitter Modus. Damit keine Durchdringungen der noch sichtbaren Linien auftreten,
sollte man Polygon Offset nutzen.
Oftmals ist der Hintergrund aber nicht einfarbig. Dann kann man den ersten Schritt mit
glColorMask() auf GL_FALSE gesetzt durchführen.
Die Linien werden wieder im normalen Modus und mit Polygon Offset gezeichnet.
24.020 Wie kann ich rubber-band Linien zeichnen ?
Bitte mal beim Rasterisieren reinschauen.
24.030 Zum Programmstart rufe ich glGetString() auf. Warum wird kein String zurückgegeben ?
Meistens wurde noch kein OpenGL Context erzeugt bzw. aktiviert. Jeder Aufruf einer
OpenGL Funktion setzt einen für ein Fenster aktivierten OpenGL Rendering Context voraus,
ansonsten werden unsinnige Werte zurückgegeben bzw. das Programm stürzt ab.
24.039 Wo kann ich fertige 3D-Modelle als Dateien bekommen ?
Da diese Frage nur wenig mit OpenGL zu tun hat, ist die folgende Liste mit Sicherheit
unvollständig:
Prinzipiell kann man ein 3D-Modell mit jedem Modeller erzeugen und dann in sein OpenGL Programm
einlesen. ModelMagic3D z.B. ist Shareware
und bietet auch den Quelltext. Auch GLScene
könnte helfen.
24.040 Wie kann ich 3D-Modellbeschreibungen (3ds, obj, dem) direkt in meinem OpenGL Programm nutzen ?
Da OpenGL hierfür keine Funktionen bietet, muss man den entsprechenden Code
dem Programm selbst hinzufügen.
Da sich schon einige Programmierer mit diesem Thema beschäftigt haben, findet
man im Netz auch schon entsprechende Hilfen:
- Datei-Formatsbeschreibungen
- Okino's PolyTrans kann die meisten
3D-Formate in OpenGL Code umwandeln.
- Crossroads
wandelt verschiedene Formate in C/C++ Code um, der sich in Vertex Arrays nutzen lässt.
- 3DWinOGL
ist Shareware, die 3D-Formate in OpenGL Primitive umwandeln kann.
- 3D Studio MAX kann Dateien auch als ASE, also im ASCII Format speichern. Diese
lässt sich relativ leicht in eigene Programme einlesen.
- Das XGL Dateiformat
wurde mit dem Ziel entworfen, alle notwendigen Informationen für eine
3D Darstellung mit OpenGL zu speichern. Open Source Parser und 3DS Konverter sind
verfügbar.
- Der GLUT
Source Code enthält im Verzeichnis progs/demos/smooth die Datei glm.c, mit der
sich Wavefront OBJ Dateien einlesen lassen.
- glElite liest DXF, ASCII und LightWave Dateien. Informationen hierzu findet man auf
http://www.helsinki.fi/~tksuoran/lw.html und
http://www.cs.helsinki.fi/~tksuoran/glelite/.
- 3D Exploration kann verschiedene Dateiformate ein- und auslesen
sowie C/C++ Quelltext erzeugen.
- Eine 3DS Import Bibliothek findet man hier.
24.050 Wie kann ich meine Szenenansicht als Bilddatei (gif, tif, jpg, bmp) speichern ?
Wie kann ich diese Bildformate lesen und als Texturen verwenden ?
Um ein bestimmtes Frame eines OpenGL Programms abzuspeichern, kann man ein einfaches
Screen Capture Programm nutzen und dieses Image als Datei speichern.
Mittels glReadPixels() ist es aber auch möglich, dieses Vorhaben direkt durch sein Programm
zu realisieren, indem man die so gelesenen Daten mit ensprechenden Routinen als Bild speichert.
Vergleichbar dazu muss für das Nutzen einer Bilddatei als Textur ebenfalls eine
eigene Routine zum einlesen der Daten eingebunden werden. Mit glTexImage2D() lässt sich
dann die Textur auf ein Objekt festbinden.
Da OpenGL keinen Zugriff auf Bilddateien bietet, muss hierfür eine eigene Funktion programmiert oder
entsprechende Bibliotheken eingebunden werden. Weitere Informationen bieten folgene Links:
- Wotsit.org beschreibt verschiedene Dateiformate.
- Die Independent JPEG Group stellt eine freie Bibliothek
zur Nutzung von JPG Dateien zur Verfügung.
- Mit der C++ mkOpenGLJPEGImage Klasse
lassen sich JPG und BMP Dateien verarbeiten.
- Mit diesem Quelltext lassen
sich TGA Dateien einlesen.
- Die GD Bibliothek liest JPG und PNG Dateien ein.
- Imlib (in dem Download-Bereich suchen)
versteht Formate vom Typ JPG, GIF, PNG und TIF .
- FürDelphi
kann diese Bibliothek genutzt werden.
24.060 Kann ich einen BSP-Baum mit OpenGL nutzen ?
BSP Bäume sind in OpenGL Programmen oftmals sinnvoll einsetzbar.
Um die Darstellung verdeckter Flächen unter OpenGL zu vermeiden, wird meist
der Tiefentest eingesetzt. Abhängig von der Struktur des Programms und der genutzten
Daten kann es aber auch möglich sein, mittels eines BSP Baumes den Tiefentest
zu vermeiden bzw. dessen Umfang/Aufwand zu reduzieren.
Ausserdem bieten BSP Bäume die Möglichkeit, vollständig verdeckte Objekte
von vorneherein aus der Berechnung auszuklammern.
BSP Bäume sind in der Lage, die korrekte Darstellung halbdurchlässiger
Objekte durch eine entsprechende Vorsortierung (rendern von hinten nach vorn) zu unterstützen.
Weitere Informationen zu BSP bietet die BSP FAQ.
24.070 Kann ich einen Octree mit OpenGL nutzen ?
Ja, OpenGL stellt dem kein Hindernis entgegen.
Ein Octree ist insbesondere dann sinnvoll einsetzbar, wenn man diese Technik in Verbindung
mit Occlusion Culling einsetzt (z.B. HP's GL_HP_occlusion_test).
24.080 Kann ich Radiosity mit OpenGL realisieren ?
OpenGL bietet zwar keine direkten Unterstützung für Radiosity, kann allerdings
zur Darstellung von vorab berechneten Daten genutzt werden.
Das Programm muss also seine eigenen Radiosity Berechnungen für die darzustellenden
Daten durchführen. Sobald die entsprechenden Farbwerte der Vertices berechnet sind,
lassen sich die Primitive mit normalen OpenGL Befehlen darstellen. Damit jedes Vertex
auch einen eigenen Farbwert erhält, muss glShadeModel() auf GL_SMOOTH gesetzt und
die Beleuchtung deaktiviert werden.
24.090 Kann ich Raytracing mit OpenGL realisieren ?
OpenGL bietet keine direkte Unterstützung für das Raytracing.
Oft möchte man Raytracing nutzen, um möglichst reale Schatten und
Refelktionen zu erhalten. Viele dieser Efefekte lassen sich allerdings auch mit
OpenGL erzielen, ohne dass man auf das aufwendige Raytracing zurückgreifen muss.
Die Bereiche zum ThemaSchatten und Texturen
können hier weiterhelfen.
OpenGL lässt sich z.B. als Teil des Schnittpunkt-Test vom Raytracing nutzen.
Eine Möglichkeit wäre, alle Primitive der Szene mit der gleichen Farbe zu
zeichnen, dann einen berechneten (Licht-)Strahl und durch das Zurücklesen der
Farben Schnittpunkte (durch veränderte Farbwerte) festzustellen.
Allerdings wird das Aliasing teilweise das Ergebnis verfäschen. Hier bietet es
sich an, Bounding Volumes (z.B. den umschliessenden Kreis eines Objekts) zu nutzen.
Durch verändern des Augpunkts und der Blickrichtung lassen sich auch verschiedene
Strahlen-Schnittpunkte testen.
Ein Raytracing Programm kann OpenGL auch zur Darstellung der berechneten Szene nutzen.
Hierfür müssen aber alle Farbwerte der einzelnen Pixel berechnet werden, die sich
dann als einzelne GL_POINTS bzw. als Datenfeld mit glDrawPixels() zeichnen lassen.
24.100 Wie kann ich CSG (computational solid geometry) mit OpenGL realisieren ?
Das Red Book beschreibt einige Techniken,
um das Ergebnis von CSG-Berechnungen darzustellen.
GLUT 3.7 enthält auch ein Programm (csg.c), das als Beispiel dienen kann.
24.110 Wie kann ich Kollisionen zwischen meinen Objekten berechnen ?
Auch hier bietet OpenGL keine direkte Unterstützung, das Programm muss die
Berechnungen also selbst durchführen.
Potientielle Kollisionen lassen sich allerdings im Vorfeld ermitteln, z.B. mit
einer vergleichbaren Technik zur Raytracing Frage.
Im Prinzip läuft das dann so ab: Die Szene wird vom Augpunkt her gezeichnet und man sieht
in Richtung der nächsten Bewegung. Es wird die orthografische Projektion und ein
field-of-view entsprechend einem das Objekt umfassenden Rechteck (bounding rectangle) gewählt.
Jetzt sind alle sichtbaren Objekte potentielle Kollisionspartner. Mit dem Abfragen der zugehörigen
Z-Werte (Entfernung) erfolgt dann die Enstcheidung.
Es gibt auch eine freie Bibliothek zur Kollisionsermittlung namens
I_COLLIDE.
24.120 Ich weiss, dass OpenGL die Funktionsaufrufe intern zwischenspeichern kann.
Kann ich eine Abbruchfunktion aufrufen, so dass dieser Zwischenspeicher geleert,
aber nicht ausgeführt wird ?
Nein. Sobald OpenGL-Funktionen aufgerufen wurden, gelten sie als ausgeführt und sind
nicht mehr abzubrechen.
24.130 Was ist der Unterschied zwischen glFlush() und glFinish() und wann sollte ich
welche Funktion nutzen ?
Die OpenGL Spec erlaubt einer Implementation, Befehle und Daten bis zur Ausführung zwischenzuspeichern.
glFlush() veranlasst, dass der Zwischenspeicher geleert und alle enthaltenen Informationen abgearbeitet werden.
Diese Funktion arbeitet unabhängig von der Zeitdauer der Ausführung der einzelnen Befehle und kann
damit auch schon zurückkehren, wenn die ausgelösten Befehle noch nicht abgearbeitet sind.
glFinish() kehrt erst dann zur aufrufenden Stelle zurück, wenn alle Befehle vollständig abgearbeitet sind.
Normalerweise wird glFlush() verwendet, wenn man in einer reinen OpenGL-Anwendung arbeitet und sicherstellen will,
dass alle Kommandos beim Tausch vom Back- zum Frontbuffer abgearbeitet sind.
glFinish() ist hilfreich, wenn in der Anwendung zusätzlich zu OpenGL-Aufrufen auch normale Funktionen
der grafischen Oberfläche des Betriebssystems benötigt werden. In solchen Programmen sollten zuerst
alle OpenGL-Funktionen aufgerufen, dann mit glFinish() abgearbeitet und zum Schluss die Zeichen-Funktionen
der Oberfläche ausgeführt werden.
24.140 Wie kann ich mit OpenGL drucken ?
OpenGL bietet derzeit keine Druckfunktionen.
Das OpenGL ARB hat zwar über ein GLS-Protokoll diskutiert, das eine einheitliche Schnittstelle
zum Drucker bietet, zurzeit muss man aber noch auf systemspezifische Funktionen zurückgreifen.
Auf Microsoft-Systemen kann man z.B. mit ALT+Druck den Inhalt des aktuellen Fensters in die Zwischenablage
kopieren, dann in einem Bildbearbeitungsprogramm als Bild einfügen und entsprechend weiterverarbeiten bzw.
drucken. Den gesamten Desktop kopiert man über die Druck-Taste.
Das Anfertigen eines Bildschirmfotos bzw. einer Kopie des Programmfensters kann man aber auch über
bestimmte Zusatzprogramme anfertigen. Unter Linux/Unix gibt es dafür z.B. xv.
Drucken geht grundsätzlich über jede geeignete Methode des Betriebssystems. Wieder am Beispiel von
Microsoft: mittels glReadPixels() den Inhalt des OpenGL-Frames auslesen, als DIB (device independent bitmap)
speichern und in einem anderen Programm zum Drucken öffnen. Zum Aufbau des DIB-Formats am besten in
die Hilfe der genutzten IDE schauen.
Dieses Tutorial
enthält ein Beispiel zum Drucken von OpenGL-Frames unter Microsoft-Systemen.
Dieser Artikel
enthält eine Beschreibung zum Speichern von vektorbasierten Bildformaten wie PDF oder WMF.
24.150 Kann ich die OpenGL Funktionsaufrufe eines Programms feststellen und protokollieren ?
IBM hat ein Programm namens ZAPdb entwickelt, das genau diese Funktionen erfüllt.
Es ist auf verschiedenen Unix-Implementationen verfügbar. Früher gab es auch eine Version
für MS Windows NT, über die es aktuell aber keine Informationen mehr gibt.
Eine Kopie kann man eventuell
hier herunterladen.
3dpipeline.com
bietet ein Produkt namens GLAlanyze Pro, dass neben anderen Funktionen auch OpenGL-Aufrufe
protokollieren kann.
Es gibt das freie Programm
GLTrace2
mit einem vergleichbaren Funktionsumfang zu ZAPdb und GLAnalyze Pro.
Theoretisch kann man auch eine eigene Bibliothek entwickeln, die alle OpenGL-Funktionen kapselt.
Nennt man die eigentliche OpenGL-Bibliothek um und speichert dagegen seine Bibliothek als (z.B. unter MS)
opengl32.dll, kann man in den gekapselten Aufruf auch entsprechende Protokoll-Funktionen einbauen.
Die eigentliche Programmier-Aufgabe ist dabei gar nicht so schwierig, allerdings wird sich die
Geschwindigkeit des OpenGL-Programms wahrscheinlich deutlich verringern.
24.160 Kann ich Rot-Blau Szenen für eine Stereoansicht rendern ?
DerViewing-Bereich
enthält Informationen zu diesem Thema.
Die Grundidee unter OpenGL ist die folgende:
-
glColorMask (GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE)
- Annahme: Die rote Ansicht ist für das linke Auge, setze die Projektions- und
Modelview-Ansicht entsprechend.
- Color- und Tiefenbuffer löschen und die linke Ansicht zeichnen.
- glColorMask (GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE)
- Setze die Projektions- und Modelview-Ansicht für die rechte Ansicht.
- Color- und Tiefenbuffer löschen und die rechte Ansicht zeichnen.
- Swap buffers.
GLUT 3.7 enthält ein Beispiel für diese Technik.
|