Vortrag - Materialien zum M3G-Vortrag an der Hochschule Fulda

Werbung
JSR – 184
Mobile 3D Graphics API
M3G
Vortrag an der Hochschule Fulda
November 2010, Dipl.-Inf (FH) Jeronimo Werder
Einleitung
●
Bisher 3D-Grafik hauptsächlich in PCs
●
Jetzt in vielen anderen Systemen, wie
–
Set-Top-Boxes (z.B. DVD-Player/-Rekorder,
Spielekonsolen u. ä.)
–
Navigationsgeräte, Boardcomputer im Auto
–
mobile Spielekonsolen
–
PDAs, PocketPCs
–
Mobiltelefone
Klassifikation der Mobiltelefone
●
Mobiltelefone lassen sich in drei Gruppen
einteilen:
–
Basicphones
geschlossene Plattform
Featurephones
offene Plattform
Smartphones
offene native Plattform
nur der Hersteller kann Anwendungen schreiben und auf
dem Gerät installieren
–
Möglichkeit eigene Anwendungen zu programmieren und zu
installieren, Zertifizierung durch Anwender oder Hersteller
wird benötigt
–
Möglichkeit native binäre Anwendungen zu installieren
Einschränkungen von Mobiltelfonen
●
●
Mobiltelefone werden mit Strom von Akkus
versorgt
Moore´sches Gesetz bei der Prozessorleistung
(40-60% mehr Schaltkreise/Jahr)
●
Das Gesetz gilt nicht für die Akkutechnologie
(max. 10% mehr Energiekapazität/Jahr)
●
Gene´sches Gesetz hilft der Entwicklung
(Energiebedarf und Hitzeentwicklung halbiert sich alle
16 Monate)
Erste 3D-Grafiken auf Mobiltelefonen
●
Erste Mobiltelefone mit 3D-Grafik 2001 in
Japan (mit einer frühen Version der Mascot Capsule
Engine von HI-Corporation)
●
Erstes auf dem europäischen Markt: Im Jahr 2002
das Nokia 3410 aber noch mit monochromen Display
●
●
Andere frühe Grafik-Engines waren in GameEngines wie Swerve, Mascot Capsule oder XForge usw.
Sie alle basieren auf Softwarerendering
Viele 3D-Grafik-APIs
●
Viele 3D-Grafik-APIs für mobile Endgeräte
–
Manche basieren auf OpenGL:
●
●
PocketGL, TinyGL, miniGL, Klimt
–
Direct 3D Mobile basiert auf DirectX 8.0
–
Unzählige Game-Engines
Im 2D-Bereich haben sich ebenfalls viele APIs
entwickelt
–
z.B.: SVG Tiny, SVG Basic, OpenVG JSR-226 und
der Nachfolger JSR 287
Grafikstandards
●
●
Problem:
–
Viele Lösungen für dasselbe Problem
–
Fehlende Portabilität für Drittanbieter
–
Verlangsamung der Entwicklung auf dem
Softwaremarkt
Lösung Grafikstandards:
–
Bessere Dokumentation
–
größere Wiederverwertbarkeit von Quellcode
–
bessere Portabilität
Grafikstandards
●
●
●
Im Jahr 2002 spezifiziert die Khronos-Gruppe
OpenGL|ES
Gleichzeitig wurde vom JCP die Mobile 3D
Graphics API (M3G) unter der Nummer
JSR 184 spezifiziert.
Beide APIs wurden parallel zueinander
entwickelt und beeinflussten sich gegenseitig
Anforderungen mobile Grafik-APIs
●
Niedrige Komplexität
●
Ein hoher Abstraktionsgrad
●
Kleine Programme
●
Hardwarefreundlichkeit
●
Produktivität
●
Orthogonales Feature Set
●
Erweiterbarkeit
●
Minimale Fragmentierung
OpenGL|ES vs. M3G
●
●
OpenGL|ES
–
ist eine Teilmenge von OpenGL
–
ist eine reine „Low-Level“-API, die eine Schnittstelle
zu Hardwarefunktionalität darstellt
Mobile 3D Graphics API
–
ist eine komplett neu entwickelte „High-Level“-API,
basiert nicht auf Java 3D
–
bietet Funktionalitäten wie Szene-Graphen, eigenes
Dateiformat und Animation
OpenGL|ES vs. M3G
●
●
OpenGL|ES
–
wird direkt für das jeweilige Betriebssystem
kompiliert
–
ist für C/C++ implementiert
Mobile 3D Graphics API
–
baut konzeptionell auf OpenGL|ES auf
–
ist eine Java-API => Virtual Machine interpretiert
den Bytecode
Anforderungen an M3G
●
●
●
●
●
Muss High-Level-Rendering (Retained Mode)
unterstützen
Muss direkten Zugriff auf den Frame-Buffer
(Immediate Mode) unterstützen
Darf keine optionalen Teile enthalten
Muss Importer für Schlüsseldatentypen (z.B.
Meshes, Texturen, komplette Szenegrahen zur
Verfügung stellen
Implementierbar auf Basis von OpenGL|ES
Anforderungen an M3G
●
●
●
●
●
Muss den nativen Float-Datentypen von Java
unterstützen
Muss auch ohne Hardware für Fließkommaberechnungen effizient implementierbar sein
Muss in unter 150KB implementierbar sein
Muss so strukturiert sein, dass Garbage
Collection minimiert wird
Muss vollständig kompatibel mit anderen Java
APIs sein (insbesondere mit MIDP)
Abgerenzung von anderen
Java-APIs
●
Java Bindings for OpenGL|ES (JSR 239)
●
Mobile Media API (MMAPI, JSR 135)
●
●
●
Scalable 2D Vector Graphics API for J2ME
(JSR 226 und 2.0-Version JSR 287)
kein Zusammenhang mit Java3D
aktuelle Version von M3G ist 1.1, die Version
2.0 wird zur Zeit entwickelt (JSR 297)
J2ME – Die Grundlage von M3G
●
Seit 1999 gibt es die Java 2 Plattform in drei
Editionen:
–
Java 2 Enterprise Edition (J2EE) für serverseitige
Lösungen
–
Java 2 Standard Edition (J2SE) für DesktopApplikationen
–
Java 2 Micro Edition (J2ME) für kleine ressourcenbeschränkte Geräte
Die drei Java Editionen
Quelle: [WER08]
●
J2ME hat im Gegensatz zu J2EE nur eine sehr
kleine Schnittmenge mit J2SE
Konfigurationen, Profile und
optionale Pakete
●
Die J2ME ist in verschiedene Schichten
aufgeteilt:
–
Konfiguration
–
Profil
–
optionale Pakete
Konfigurationen, Profile und
optionale Pakete
●
Die Konfiguration definiert die kleinstmögliche
Funktionalität einer bestimmten Geräteklasse
–
stellt die Virtual Machine (VM)
–
definiert die unterstützten Sprachmittel
Konfigurationen, Profile und
optionale Pakete
●
●
Das Profil erweitert die Konfiguration um
spezielle Leistungsmerkmale bzw.
Klassenbibliotheken.
Anders als bei der Konfiguration darf das Profil
optionale Teile enthalten
Konfigurationen, Profile und
optionale Pakete
in Anlehnung an: [SCH04]
●
●
Die optionalen Pakete sind Klassenbibliotheken,
die Funktionalität anbieten, die über Profile
hinausreichen.
Werden von einer JCP-Expertengruppe in einem
Java Specification Request (JSR) definiert.
M3G im Java Software-Stack
Quelle: [PUL08]
●
Die Position von M3G innerhalb des Java
Software-Stacks
MIDlets
●
●
●
Die Java-Applikationen für das MIDP werden
MIDlets genannt
Ein oder mehrere MIDlets werden wiederum zu
einer MIDlet-Suite zusammengefasst, die die
kleinste installierbare Einheit bildet
Die Funktionalität zum Installieren und
Ausführen eines MIDlets muss vom Gerät
selbst zur Verfügung gestellt werden
MIDlets
Architektur eines typischen M3G-Gerätes,
Quelle: [HÖF07]
MIDlets
●
●
●
Diese Funktionalität zum Ausführen und der
Installation u.s.w. wird unter dem Begriff
Application Management Software (AMS)
zusammengefasst
Eine MIDlet-Suite wird mit ihren Klassen und
Ressourcen in einem JAR-Archiv verpackt
Im JAR-Archiv ist auch eine Manifest-Datei, die
Metainformationen über das MIDlet enthält
MIDlets
●
MIDlets müssen den Anforderungen von
Mobiltelefonen, wie geteilte Ressourcen und
eingehende Anrufe, gerecht werden
●
Daher haben MIDlets keine main()-Methode
●
MIDlets werden von Ereignissen gesteuert
●
Daher werden statt der main()-Methode ein
Satz von Event Handler implementiert
MIDlets
●
●
Lebenszyklus eines MIDlets, Quelle: [PUL08]
Ein MIDlet kann sich in
einem der drei Zustände
befinden
Der Übergang zwischen
den Zuständen wird
durch die AMS über die
drei Eventhandler
gesteuert
MIDlets
●
●
Die Event Handler finden sich in der Klasse
MIDlet des MIDP
Daher muss ein MIDlet auf jeden Fall die
Klasse MIDlet erweitern und die Methoden
startApp(), pauseApp() und
destroyApp() implementieren
MIDlets
Erweiterung der Klasse MIDlet,
Quelle: [SPE05]
M3G noch näher betrachtet
●
●
●
Nachdem das Grundgerüst für ein MIDlet
geschaffen wurde, kann nun näher auf M3G
eingegangen werden
Der Benutzer hat nun die Möglichkeit, sowohl
auf einer High-Level-Ebene als auch auf der
Low-Level-Ebene zu programmieren
Es können auch High-Level-Eigenschaften
zusammen mit Low-Level-Eigenschaften
gemischt werden
Immediate Mode vs. Retained Mode
Low Level vs. High Level
●
●
●
Dem entsprechend unterstützt M3G zwei Modi:
–
Immediate Mode
–
Retained Mode
Immediate = direkt, sofort, ...
kann auch als „Low-Level Mode“ angesehen
werden
Retained = zurückbehalten, einbehalten, ...
kann auch als „High-Level Mode“ angesehen
werden.
Immediate Mode Rendering
●
●
OpenGL war ursprünglich eine reine Immediate
Mode API
Erstes Retained Mode Konzept waren die
Display Listen
Retained Mode Rendering
●
●
●
●
Frühe Szenengraphen wie Performer von SGI
wurden entwickelt um die Performanzprobleme
vom Immediate Mode zu lösen
Vorteil des Immediate Modes ist die volle
Kontrolle über die Render-Engine
M3G dagegen wurde von Grund auf als ein
Retained Mode System entwickelt
Herzstück des Retained Modes ist der
Szenengraph
Retained Mode Rendering
●
Ein Beispiel für einen Szenengraphen
Retained Mode Rendering
●
Hauptzweck des Szenengraphen in M3G:
–
Visibility Culling
●
–
hierarchische Transformationen
●
–
zu weit entfernte Objekte, verdeckte Objekte werden vom
Rendering ausgeschlossen
Beispiel Sonnensystem (siehe vorherige Folie)
View Frustum Culling
●
Bounding Volume Hierarchie bestimmt durch einfache
umschreibende Körper, ob ein Objekt sich im Sichtfeld
befindet
Retained Mode Rendering
Beispiel für eine Bounding Volume Hierarchie,
●
●
Quelle: [PUL08]
Einfache Körper umschreiben komplexere
Bounding Volumes können seinerseits untergeordnete Bounding Volumes umschreiben
Retained Mode Rendering
●
Ablauf des Retained Mode Rendering aus Sicht
einer typischen M3G-Implementierung:
Grafik nach [PUL08]
Retained Mode Rendering
●
Aus Sicht des Softwareentwicklers bzw. des
Anwenders:
–
Retained Mode Rendering = Rendern des
gesamten Szenen Graphen
–
Immediate Mode Rendering = Rendern einer
Geometrie, eines Knoten oder Teils des
Szenengraphen
Der Szenengraph in M3G
Quelle: [SPE05]
Die Klassen von M3G
Die Klassenstruktur des Pakets javax.microedition.m3g,
Quelle: [PUL08]
Die Klassen von M3G
●
●
Die gestrichelte Linie umkreist die Klassen,
welche die Low-Level Eigenschaften von M3G
abbilden (Wrapper-Klassen von OpenGL ES).
M3G stellt als geometrische Primitive nur noch
den Triangle Strip zur Verfügung.
Links werden zum Vergleich die geometrischen
Primitive von OpenGL ES
gezeigt
Quelle: [PUL08]
Die Klassen von M3G
●
●
●
●
Fast alle Eigenschaften von OpenGL ES 1.0
werden durch M3G zur Verfügung gestellt
Die Szenengraphknoten sind alle von der
Klasse Node abgeleitet
Ein Körper wird durch die Klasse Mesh
repräsentiert
Zusätzlich gibt es noch deformierbare Varianten
von Mesh: SkinnedMesh und MorphingMesh
Die Klassen von M3G
●
●
●
●
M3G ermöglicht die Keyframe-Animation
Die Klasse KeyFrameSequence speichert die
Keyframes
Die Klasse AnimationController legt die
Geschwindigkeit der Animation fest
AnimationTrack verbindet schließlich die
Keyframesequenz, die Animationskontrolle und
das Zielobjekt
Die Klassen von M3G
●
●
●
Eine sehr wichtige High-Level-Eigenschaft
bietet die Klasse Loader
In der M3G-Spezifikation wird ein eigenes
Binärformat definiert, das alle Eigenschaften
der API abbildet
Durch das Binärformat wird eine Trennung von
gestalterischen Inhalten und der
programmierbaren Anwendungslogik wesentlich
erleichtert
Die Klassen von M3G
●
●
●
Mit der Klasse Loader lassen sich also ganze
Szenen und Szenengraphen aus M3G-Dateien
importieren
Darüber hinaus lassen sich auch individuelle
Bilder aus PNG und JPEG-Dateien laden
Loader kann nicht instantiiert werden und
bietet nur zwei statische Methoden:
Object3D[] load(String name)
Object3D[] load(byte[] data, int offset)
Die Klassen von M3G
●
●
Die Klasse RayIntersection speichert eine
Referenz auf ein sich überkreuzendes Mesh
oder Sprite3D.
Dazu wird vom Anwender mit der Methode
pick() ein Strahl in die Szene geschickt und
die Methode füllt dann das
RayIntersection-Objekt mit einer Referenz
auf das Objekt, dass sich mit dem Strahl
schneidet.
Das Rendering-Konzept von M3G
●
●
●
●
M3G stellt nur den 3D-Grafikkontext zur
Verfügung.
M3G selbst stellt keine 2D-Oberfläche für die
Anzeige auf dem Display zur Verfügung.
Diese Aufgabe übernehmen andere APIs wie
beispielsweise das MIDP.
Es muss also eine 2D-Oberfläche als RenderZiel (Rendering Target) zur Verfügung gestellt
werden.
Das Rendering-Konzept von M3G
●
Vier Schritte, um eine 3D-Szene mit M3G zu
rendern:
1) Eine Instanz von Graphics3D holen
2) Ein Rendering Target an den Grafikkontext (die
Instanz von Graphics3D) binden
3) Die 3D-Szene auf dem Rendering Target zeichnen
4) Das Rendering Target wieder freigeben
Das Rendering-Konzept von M3G
Rendern einer 3D-Szene mit M3G,
Quelle: [SPE05]
Das Rendering-Konzept von M3G
void bindTarget(java.lang.Object target,
boolean dephtBuffer,
int hints)
–
Mit target wird das Renderziel übergeben
–
Mit depthBuffer kann der Tiefnpuffer ein- oder
ausgeschaltet werden
–
Mit dem dritten Argument hints können noch
weitere Hinweise übergeben werden
Das Rendering-Konzept von M3G
●
Retained Mode Rendering:
void render(World world)
●
Immediate Mode Rendering
void render(Node node,
Transform transform)
void render(VertexBuffer vertices,
IndexBuffer triangles,
Appearance appearance,
Transform transform)
M3G 2.0
●
Wird in JSR 297 definiert
●
Immer noch nicht endgültig verabschiedet
●
Einige Schlüsselneuerungen sind:
–
Höhere Render-Qualität
–
Reduzierter Speicherbedarf
–
Schnelleres Rendering
–
Reduzierte Zergliederung der API
–
Vereinfachte Handhabung und größere Flexibilität
M3G 2.0
●
●
Ist eine voll kompatible
Erweiterung
von M3G 1.1
wird in einen
allgemein
gültigen „Core“Block und einen
optionalen
„Advanced“- Block
unterteilt
M3G 2.0 Advanced
M3G 2.0 Core
M3G1.1
Feature Set
Was ist neu im Core-Block?
●
Collision Detection => world.collide(...)
dient dazu Kollisionen zu ermitteln
●
Optimierte Animation und Deformation
●
Neue grafische Primitive
●
–
Point Sprites
–
Triangle Lists
–
Lines
Automatisches Level of Detail (LOD)
Was ist neu im Core-Block?
●
„Depth Sorting“ bei transparenten Objekten
●
Dynamische (Video) Texturen
●
Einige optionale Features sind nun Standard
–
Mipmapping
–
Perspective Correction
–
Multitexturing (mind. 2)
–
Texturformate bis 1024 x 1024
Was ist neu im Advanced-Block?
●
Programmierbare Shader
●
Stencil Buffering
●
Cube mapping
●
Advanced blending
●
Bei Verwendung des Advanced Block sollte
folgendes Attribut in die JAD-Datei eingetragen
werden: M3G-Version: 2.0-Advanced
Quellen & Literatur
●
●
[PUL08] : Kari Pulli, Tomi Aarnio,
Ville Miettinen, Kimmo
Roimela, Jani Vaarala,
Mobile 3D Graphics,
2008, Morgan Kaufmann
[HÖF07] : Claus Höfele ,
Mobile 3D Graphics,
Learning 3D Graphics with the
Java Micro Edition,
2007, Thomson Course
Technology PTR
Quellen und Literatur
●
[SCH04] :
Klaus-Dieter Schmatz,
Java 2 Micro Edition,
2004, dpunkt.verlag GmbH
●
[SPE05] :
JSR-184 Expert Group,
Java Community Process (JCP),
Mobile 3D Graphics API Technical Specification,
http://www.jcp.org/en/jsr/detail?id=184
●
[WER08]:
Jeronimo Werder,
Realisierung von 3D Grafiken für mobile
Endgeräte unter Betrachtung geeigneter
Grafikbibliotheken und Fenstersystemen
Fragen & Anregungen
?
Zum Schluss noch...
Vielen Dank für Ihre
Aufmerksamkeit !!!
Herunterladen