Gegenüberstellung von Direct3D und Java3D am praktischen Beispiel

23
Java3D Java3D TM TM und Direct3D ® und Direct3D ® Florian Heidinger Gegenüberstellung von Direct3D und Java3D am praktischen Beispiel

description

Gegenüberstellung von Direct3D und Java3D am praktischen Beispiel. Treffen der Generationen. 3D-APIs der 3. Generation. 90er Jahre. 1997. Direct3D , OpenGL. Java3D. 3D-API der 4. Generation. Florian Heidinger. Kein altes Eisen: die 3. Generation. - PowerPoint PPT Presentation

Transcript of Gegenüberstellung von Direct3D und Java3D am praktischen Beispiel

Page 1: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Gegenüberstellung von Direct3D und Java3D

am praktischen Beispiel

Page 2: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Treffen der Generationen

90er Jahre

3D-API der

4. Generation

Dir

ect3

D, O

pen

GL

Java3D

1997

Florian Heidinger

3D-APIs der

3. Generation

Page 3: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Kein altes Eisen: die 3. Generation

Direct3D

Entwickelt durch Microsoft als Bestandteil von DirectX

Lauffähig nur unter Windows-Betriebssystemen

Low-Level-API

Hardware-transparenz (aus Sicht des Anwendungs-entwicklers)

Programmiersprachen:

C/C++, MS Java, VisualBasic

COM-Objekte und Schnittstellen

Hardwarebe-schleunigung und Emulation

Vorwiegend prozeduraler Programmaufbau

Laufzeitumgebung ist Bestandteil des Betriebsyst.

Page 4: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Ein neuer Stern am Graphik-Himmel

Java3D

Entwickelt durch Unternehmens-allianz (Sun, Intel, IBM, Apple)

„Write Once, Run Anywhere“-Paradigma

High-Level-API

Programmier-sprachen:

Java

Java-Pakete (Packages) und Laufzeitbibliothek

Nutzung einer Low-Level-API zur Durchführung der Zeichenaufträge

objektorientierter API- und Szenenaufbau Szenengraph

Page 5: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Die Architektur verbindet

Hardware und Hardware-TreiberHardware und Hardware-Treiber

Direct3D APIDirect3D API

Direct3D-AnwendungDirect3D-Anwendung

OpenGLOpenGL

Java Virtual MachineJava Virtual Machine

Java3D-AnwendungJava3D-Anwendung

Java3D APIJava3D API

Page 6: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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 einerDirect3D-Anwendung

Page 7: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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

Page 8: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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

Page 9: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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

Page 10: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Initialisieren von Direct3D

DIRECT3D8DIRECT3D8

LPDIRECT3D8LPDIRECT3D8

Direct3DCreate8()

DIRECT3D8DIRECT3D8

DIRECT3D-DEVICE8

DIRECT3D-DEVICE8

LPDIRECT3D-DEVICE8

LPDIRECT3D-DEVICE8

COM-System

CreateDevice()

Page 11: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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

Page 12: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Direct3D-Rendering PipelineVertexBufferVertexBuffer

WelttransformationWelttransformation

AnsichtstransformationAnsichtstransformation

ProjektionstransformationProjektionstransformation

Vertex-Shader

VertexAssembly-ProzessVertexAssembly-ProzessFarbe, Texturkoor-dinaten, ...

Farbe, Texturkoor-dinaten, ...

Pixel-ShaderPixel-ShaderMaterial, Textur-graphik, ...

Material, Textur-graphik, ...

Alpha, Stencil und Tiefentests

Alpha, Stencil und Tiefentests

Frame-BufferFrame-Buffer

Page 13: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Ansichts- und Projektions-transformation 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

Page 14: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Inhaltsgraph in Java3D

Page 15: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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

Page 16: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Links- und rechtshändiges Koordinatensystem

Java3D (rechtshändiges Koordinatensystem)

Java3D (rechtshändiges Koordinatensystem)

V0

V1 V2

Direct3D(linkshändiges Koordinatensystem)

Direct3D(linkshändiges Koordinatensystem)

V0

V1V2

Reihenfolge der Raumpunkte invertieren

Zusätzlich Skalierung der Ansichtstransformationsmatrix um den Faktor –1 in Z-Richtung

Page 17: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Kompilieren des Szenengraphen

• 1. Zusammenfassung von Transformationsgruppen ohne gesetztes Capability-Bit

• 2. Kombination von Shape3D-Objekten, die Nachfolger einer gemeinsamen Transformationsgruppe sind und das gleiche Appearance-Objekt referenzieren

optimierte interne Form des Szenengraphen

A ns ichtsgraph

B L L

B G

T G

T G T G

G G

S

G eometryA ppearance

T exture2D M ateria l C o lo ringA ttr.

S

G eometryA ppearance

T exture2D M ateria l C o lo ringA ttr.

Page 18: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Der Java3D Renderer

• Nachdem alle im in der internen Form des Szenengraphen definierten Objekte instanziiert und initialisiert wurden, kann der Java3D Renderer gestartet werden

• „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.

while(true) {Benutzereingaben verarbeiten

If (Anwendungsende) break

Verhalten bearbeiten (Welttrans.)

Szenengraph traversieren und sichtbare Objekte an die Direct3D API übergeben / zeichnen}

while(true) {Benutzereingaben verarbeiten

If (Anwendungsende) break

Verhalten bearbeiten (Welttrans.)

Szenengraph traversieren und sichtbare Objekte an die Direct3D API übergeben / zeichnen}

Page 19: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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)

Page 20: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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)

Page 21: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

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

Page 22: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Literatur(1)

Java3D:

Bouvier, Dennis “The Java3D Tutorial” – Kapitel 1-7 (1999)

Subra, Mohan “Java Markets Whitepaper” (1998)

Sun Microsystems, “The Java3D API - Technical Whitepaper”

(1997)“Java 3D API Collateral –

1.2.1 Performance Guide” (2002)

“Java 3D Programming: A Technical Overview”

(1998)www.j3d.org “Java 3D API”

Page 23: Gegenüberstellung von  Direct3D  und  Java3D am praktischen Beispiel

Java3

DJa

va3

DTM

TM

un

d D

irect3

D

®

un

d D

irect3

D

®Florian Heidinger

Literatur(2)

Direct3D:

Dunlop, Robert “Teach Yourself DirectX 7 in 24 Hours” (1998) Microsoft,  “DirectX 8.0

Documentation (Visual C++)“ (2000)Zerbst, Stefan “3D Graphik-

Programmierung und Spiele-

Programmierung mit DirectX“ (2002)