Gegenüberstellung von Direct3D und Java3D

Werbung
Java3DTM und Direct3D®
Gegenüberstellung von
Direct3D und Java3D
am praktischen Beispiel
Florian Heidinger
3D-APIs der
1997
Java3D
3. Generation
90er Jahre
Direct3D, OpenGL
Java3DTM und Direct3D®
Treffen der Generationen
3D-API der
4. Generation
Florian Heidinger
Java3DTM und Direct3D®
Kein altes Eisen: die 3. Generation
Entwickelt durch
Microsoft als
Bestandteil von
DirectX
Lauffähig nur unter
WindowsBetriebssystemen
Low-Level-API
Hardwarebeschleunigung und
Emulation
Direct3D
Laufzeitumgebung
ist Bestandteil
des Betriebsyst.
COM-Objekte und
Schnittstellen
Florian Heidinger
Programmiersprachen:
C/C++, MS Java,
VisualBasic
Hardwaretransparenz
(aus Sicht des
Anwendungsentwicklers)
Vorwiegend
prozeduraler
Programmaufbau
Java3DTM und Direct3D®
Ein neuer Stern am Graphik-Himmel
Entwickelt durch
Unternehmensallianz
(Sun, Intel,
IBM, Apple)
High-Level-API
Java3D
Nutzung einer LowLevel-API zur
Durchführung der
Zeichenaufträge
Programmiersprachen:
objektorientierter
API- und Szenenaufbau
 Szenengraph
„Write Once, Run
Anywhere“Paradigma
Java-Pakete
(Packages) und
Laufzeitbibliothek
Florian Heidinger
Java
Java3DTM und Direct3D®
Die Architektur verbindet
Java3D-Anwendung
Java3D API
Direct3D-Anwendung
Direct3D API
Java Virtual Machine
OpenGL
Hardware und Hardware-Treiber
Florian Heidinger
Java3DTM und Direct3D®
Schritte zum Erfolg in Java3D
1.
Fenster und Canvas3D-Objekt erzeugen
 Darstellungsfläche schaffen und Zeichengerät auswählen
bzw. initialisieren
2.
Ansichtsgraph erzeugen (SimpleUniverse)
 Positionierung und Ausrichtung des Betrachters
3.
Inhaltsgraph erzeugen
 Definition des Szeneninhaltes
4.
Kompilieren der Teilgraphen
 Interne optimale Form der Szene bilden
5.
Hinzufügen zum „Locale“-Objekt
Die meisten der Schritte besitzen Entsprechungen in einer
Direct3D-Anwendung
Florian Heidinger
Java3DTM und Direct3D®
Fenster unter Windows mit Java
• Nutzung der Klassen des AWT (Abstract Windowing Toolkit),
um Fenster zu erzeugen
• LayoutManager, um die Darstellungsfläche des Frame in
verschiedene Bereiche einzuteilen
 Importieren entsprechender AWT- und Layout-Manager
Klassen
 Erstellen eines Frame-Objekts, dem primäre
Fenstereigenschaften wie Breite und Höhe als
Konstruktor-Parameter übergeben werden (sekundäre
Eigenschaften über SET-Methoden einstellbar)
 Instanziierung eines LayoutManager-Objekts
 Zuweisen des Layouts über die „setLayout()“-Methode
Florian Heidinger
Java3DTM und Direct3D®
Fenster unter Windows in Direct3D
• Aufrufe gegen die Windows-API (Win32-API), um ein
geeignetes Fenster zu erzeugen
 Inkludieren der „windows.h“-Headerdatei (Struktur-,
Konstanten- und Methodendefinitionen)
• Drei Schritte:
1. Fensterobjekt (Schablone) für neue Fenster
(WNDCLASSEX-Struktur) definieren und mit Werten füllen
= sekundäre Fenstereigenschaften festlegen
2. Fensterobjekt bei Windows registrieren
3. Fenster durch Aufruf von „CreateWindowEx()“
erzeugen (Parameter sind primäre Fenstereigenschaften,
sowie der Name des Fensterobjekts)
 Keine LayoutManager unter Windows
Florian Heidinger
Java3DTM und Direct3D®
Canvas3D eine mysteriöse Klasse
• Erzeugen eines Canvas3D-Objektes mit Hilfe eines der beiden
Konstruktoren
• Hinzufügen zur Darstellungsfläche des Fensters durch „add“Methode
 Java 3D Implementierung initialisiert die Low-Level API, um
Canvas3D Darstellungsfläche zu schaffen:
– DoubleBuffer und Z-Buffer
– 16 Bit-Farbtiefe (True-Color)
– Viewport entsprechend der Größe des Layoutbereichs in Pixeln
• Definition einer perspektivische Projektion
Florian Heidinger
Java3DTM und Direct3D®
Initialisieren von Direct3D
DIRECT3D8
COM-System
Direct3DCreate8()
DIRECT3D8
LPDIRECT3D8
CreateDevice()
DIRECT3DDEVICE8
LPDIRECT3DDEVICE8
Florian Heidinger
Java3DTM und Direct3D®
Ansichtsgraph in Java3D
• Benutzerposition und Blickrichtung
• Verwendung des „SimpleUniverse“ mit Positionierung des
Benutzers im Punkt (0.0, 0.0, 2.41) und Blickrichtung in
negative Z-Richtung  Standard-Ansichtstransformation
• Animation der Benutzerposition durch eine erweiterte
Welttransformation  World-View-Matrix
(Behaviors werden in der Regel Transformationsgruppen im
Inhaltsgraphen zugeordnet)
– Rotationen um gleiche Achse und Winkel, jedoch in
entgegengesetzter Rotationsrichtung
– Translationen mit entgegengesetzt gerichtetem
Vektor
– Transformation mit allen Weltmatrizen der Szenenobjekte
nach dem LIFO-Prinzip multiplizieren
Florian Heidinger
Java3DTM und Direct3D®
Direct3D-Rendering Pipeline
VertexBuffer
Welttransformation
Ansichtstransformation
Vertex-Shader
Projektionstransformation
VertexAssembly-Prozess
Farbe,
Texturkoordinaten, ...
Pixel-Shader
Material,
Texturgraphik, ...
Alpha, Stencil und
Tiefentests
Florian Heidinger
FrameBuffer
Java3DTM und Direct3D®
Ansichts- und Projektionstransformation in Direct3D
• Projektionsmatrix für perspektivische oder orthogonale
Projektion mit Hilfe von Bibliotheksfunktionen
(„D3DXMatrixPerspectiveLH()“)
• Konstante Ansichtsmatrix zum Initialisierungszeitpunkt
auch hier Nutzung einer Bibliotheksfunktionen
„D3DXMatrixLookAtLH()“, mit Angabe des
Kamerastandorts, Zielpunkt und Kameralagevektor
• DIRECT3DDEVICE8-Objekt ist Bindeglied zwischen
Anwendung und Rendering-Pipeline
 Zentrale Bedeutung in der Direct3D-Programmierung
• Erzeugte Matrizen über „setTransform()“-Methode des
DIRECT3DDEVICE8-Objektes in die Rendering-Pipeline
einstellen
Florian Heidinger
Java3DTM und Direct3D®
Inhaltsgraph in Java3D
Florian Heidinger
Java3DTM und Direct3D®
Inhaltsdefintion einer Szene in
Direct3D
• Ablegen von Daten in Strukturen
• die Strukturelemente besitzen dabei weitgehende
Übereinstimmung mit Klassenvariablen in Java3D, z. B.
Material, Lichtquellen, etc.
• Vertextformat flexibel (FVF)
• Geometriedaten als Strukturarray in VertexBuffer-Objekte
speichern
• Direct3D verwendet linkshändiges Koordinatensystem
 Anpassung der Geometriedaten und / oder
Ansichtstransformation ist bei der Ausführung einer
Java3D-Anwendung erforderlich
Florian Heidinger
Java3DTM und Direct3D®
Links- und rechtshändiges
Koordinatensystem
Java3D
(rechtshändiges
Koordinatensystem)
V0
V1
Direct3D
(linkshändiges
Koordinatensystem)
V0
Reihenfolge der
Raumpunkte
invertieren
V2
V2
V1
 Zusätzlich Skalierung der Ansichtstransformationsmatrix um den
Faktor –1 in Z-Richtung
Florian Heidinger
Java3DTM und Direct3D®
Kompilieren des Szenengraphen
• 1. Zusammenfassung von
Transformationsgruppen
ohne gesetztes CapabilityBit
BG
• 2. Kombination von
Shape3D-Objekten, die
Nachfolger einer
gemeinsamen
Transformationsgruppe
sind und das gleiche
Appearance-Objekt
referenzieren
B
Florian Heidinger
TG
L
TG
TG
G
L
G
S
S
Appearance
•  optimierte interne
Form des Szenengraphen
Ansichtsgraph
Texture2D
Material
Geometry
ColoringAttr.
Appearance
Texture2D
Geometry
Material
ColoringAttr.
Java3DTM und Direct3D®
Der Java3D Renderer
• Nachdem alle im in der internen Form des Szenengraphen
definierten Objekte instanziiert und initialisiert wurden, kann
der Java3D Renderer gestartet werden
while(true) {
Benutzereingaben verarbeiten
If (Anwendungsende) break
Verhalten bearbeiten (Welttrans.)
Szenengraph traversieren und
sichtbare Objekte an die Direct3D
API übergeben / zeichnen
}
• „StateOrdered“-Rendering: Zeichenfolge, bei der zwischen
den Zeichenvorgängen zweier Objekte möglichst
wenige Statusänderungen in der Rendering-Pipeline der
Low-Level API durchgeführt werden müssen.
Florian Heidinger
Java3DTM und Direct3D®
Zeichnen der Objekte in Direct3D
• Das Zeichnen geschieht in der Hauptschleife der
„WinMain“-Methode  ähnliche Struktur, wie der Java3D
Renderer
• Zunächst Verarbeitung der an das Fenster der Anwendung
gerichteten Nachrichten in einer Callback-Prozedur
• Falls in einem Durchlauf keine Nachrichten zu verarbeiten
sind, kann der eigentliche Zeichenvorgang stattfinden, der
dem DIRECT3DDEVICE8-Objekt durch „BeginScene()“ und
„EndScene()“ angezeigt wird
• Zeichenfolge in Direct3D vollständig durch den Benutzer
spezifiziert (vor dem Aufruf der „DrawPrimitive()“-Methode
Rendering-Pipeline mit den richtigen Geometriedaten
(VertexBuffer), der Welttransformationsmatrix, Textur,
Material usw. versorgen)
Florian Heidinger
Java3DTM und Direct3D®
Optimale Zeichenfolge
1. Gruppieren von Objekten mit gleicher Textur
 Das Nach- bzw. Umladen von Texturen aus dem
Hauptspeicher ist aufwendigste Operation
2. Gruppieren von Objekten mit anderen Texturen aber
gleicher Geometrie
3. Gruppieren von Objekten mit anderen Texturen und
Geometrien aber gleicher Welttransformation oder
gleichem Material
 Auf die Beispielanwendung bezogen sollten also z. B.
zunächst die Pyramidenseitenflächen beider Pyramiden und
erst anschließend die beiden Bodenflächen gezeichnet
werden (oder umgekehrt)
Florian Heidinger
Java3DTM und Direct3D®
Aller Anfang ist schwer !
• Komplexe API, die sich dem Einsteiger in die
Graphikprogrammierung nur schwer erschließt
• Erhöhter zeitlicher Aufwand und mehrfaches an
benutzerdefiniertem Programmcode im Vergleich zu OpenGL
oder Java3D
• Viel Erfahrung erforderlich, um eine annährend optimale
Zeichenfolge von geometrischen Objekten zu implementieren
• Zahlreiche hilfreiche Funktionen wie Normalen- und
Texturkoordinaten-Generatoren fehlen
• Bietet dem fortgeschrittenen Benutzer jedoch weitere,
von Java3D bis jetzt nicht unterstützte Funktionen wie
Multitexturing, Partikeleffekte uvm. an
Florian Heidinger
Java3DTM und Direct3D®
Literatur(1)
Java3D:
Bouvier, Dennis
Subra, Mohan
Sun Microsystems,
www.j3d.org
Florian Heidinger
“The Java3D Tutorial” –
Kapitel 1-7 (1999)
“Java Markets Whitepaper”
(1998)
“The Java3D API Technical Whitepaper”
(1997)
“Java 3D API Collateral –
1.2.1 Performance Guide”
(2002)
“Java 3D Programming: A
Technical Overview”
(1998)
“Java 3D API”
Java3DTM und Direct3D®
Literatur(2)
Direct3D:
Dunlop, Robert
Microsoft,
Zerbst, Stefan
Florian Heidinger
“Teach Yourself DirectX 7
in 24 Hours” (1998)
“DirectX 8.0
Documentation (Visual
C++)“ (2000)
“3D GraphikProgrammierung und
Spiele-Programmierung
mit DirectX“ (2002)
Herunterladen