WhyOpenGL: Unterschied zwischen den Versionen
(→Allgemein) |
(→Bei 2D-Anwendungen?) |
||
Zeile 21: | Zeile 21: | ||
==== Pseudo-3D ==== | ==== Pseudo-3D ==== | ||
− | Früher wurde versucht mit Hilfe einer isometrischen Engine eine 2D-Grafik so ausehen zu lassen als sei diese eigentlich dreidimensional. Ich denke jeder von Euch hat bereits einmal SimCity oder Jagged Alliance gesehen und kann sich in etwa vorstellen, was unter einer ISO-Engine verstanden wird. Eine solche Technik in der heutigen Zeit einzusetzen ist meistens eher hinderlich als | + | Früher wurde versucht mit Hilfe einer isometrischen Engine eine 2D-Grafik so ausehen zu lassen als sei diese eigentlich dreidimensional. Ich denke jeder von Euch hat bereits einmal SimCity oder Jagged Alliance gesehen und kann sich in etwa vorstellen, was unter einer ISO-Engine verstanden wird. Eine solche Technik in der heutigen Zeit einzusetzen ist meistens eher hinderlich als produktiv. Man stelle sich nur einmal eine Figur darauf vor, die sich in mehre Richtungen bewegen kann. Für jede Bewegungsrichtung müßte man bei reinem 2D eine Grafik bereit halten (und sei es nur im Speicher). In einem 3D-Raum könnte man einfach ein Modell nehmen und dieses wirklich von mehren Seiten betrachten. Würde man nun auf die Idee kommen die Kameraeinstellung um nur wenige Grad zu drehen, würde dies einer kompletten Neuerstellung aller Grafiken zur Folge haben. |
Verwendet man statt dessen einen 3D-Raum mit einer Kamera, die nur nach oben, unten, links und rechts verschoben wird und ansonsten immer in einem festen Winkel auf das Spielfeld blickt, so erhält man einen ähnlichen Effekt wie bei einer isometrische Engine. Der Vorteil, dass zahlreiche mathematische Operationen nur im 2D-Raum berechnet werden müssen, bleibt ebenfalls weiterhin erhalten. Dafür werden die Grafiken allerdings weitesgehend von der GPU berechnet, und es werden zahlreiche transparente Effekte zugelassen. | Verwendet man statt dessen einen 3D-Raum mit einer Kamera, die nur nach oben, unten, links und rechts verschoben wird und ansonsten immer in einem festen Winkel auf das Spielfeld blickt, so erhält man einen ähnlichen Effekt wie bei einer isometrische Engine. Der Vorteil, dass zahlreiche mathematische Operationen nur im 2D-Raum berechnet werden müssen, bleibt ebenfalls weiterhin erhalten. Dafür werden die Grafiken allerdings weitesgehend von der GPU berechnet, und es werden zahlreiche transparente Effekte zugelassen. | ||
==== Orthogonale Grafik ==== | ==== Orthogonale Grafik ==== | ||
− | Doch selbst wenn man nur eine reine 2D-Grafik wünscht wie sie vor 15 Jahren noch üblich war, bietet es sich an eine moderne 3D-Schnittstelle wie OpenGL zu verwenden. Dies mag auf den ersten Blick nicht logisch erscheinen. Allerdings macht dies Sinn, wenn man sich | + | Doch selbst wenn man nur eine reine 2D-Grafik wünscht wie sie vor 15 Jahren noch üblich war, bietet es sich an eine moderne 3D-Schnittstelle wie OpenGL zu verwenden. Dies mag auf den ersten Blick nicht logisch erscheinen. Allerdings macht dies Sinn, wenn man sich bewusst wird, dass die Grafiken bei OpenGL über die GPU der Grafikkarte geschickt werden, die meistens um ein vielfaches leistungsfähiger als die CPU ist (und diese ja auch mit anderen Berechnungen wie z.B. der KI beschäftigt). Zeichnet man stattdessen ein Quadrat und klebt eine Textur in Form der gewünschten Grafik darauf, erhält man ebenfalls den gewünschten Effekt. |
− | Es mag nun kompliziert klingen in einem 3D-Raum Quadrate zu plazieren und zu texturieren. Man sollte allerdings wissen, dass es einen sogenannten orthogonalen Modus gibt in dem man bei einem 3D-Raum die Tiefe entfernt und somit wieder einen 2D-Raum erhält. Mit Hilfe des Tiefenbuffers kann man nun sogar noch die Z-Werte verwenden um die Zeichenreihenfolge der Quadrate zu bestimmen. Ein Tutorial zu Verwendung dieser Technik findet Ihr [http://www.delphigl.com/script/do_show.php?name=opengl2d&action=2 hier]. | + | Es mag nun kompliziert klingen in einem 3D-Raum Quadrate zu plazieren und zu texturieren. Man sollte allerdings wissen, dass es einen sogenannten orthogonalen Modus gibt in dem man bei einem 3D-Raum die Tiefe entfernt und somit wieder einen 2D-Raum erhält. Mit Hilfe des Tiefenbuffers kann man nun sogar noch die Z-Werte verwenden um die Zeichenreihenfolge der Quadrate zu bestimmen. Ein Tutorial zu Verwendung dieser Technik findet Ihr [http://www.delphigl.com/script/do_show.php?name=opengl2d&action=2 hier]. Ausserdem sind alle nötigen Befehle hier in diesem Wiki (auf Deutsch) oder in euerer Delphihilfe (Englisch) bzw. im Netz (Englisch) dokumentiert. |
=== Alternativen === | === Alternativen === |
Version vom 3. Juli 2005, 09:50 Uhr
(Mehr Informationen/weitere Artikel) {{{1}}} |
Phobeus: Dies soll nur ein Stub sein und zur Ideensammlung dienen / Wir haben sehr viele Leute im Netz rumlaufen, die noch denken, dass DelphiX das absolute Non-Plus-Ultra ist. Ich würde gerne einen Artikel haben um einige gänige Fragen zu beantworten.
Inhaltsverzeichnis
Warum OpenGL...
Allgemein
OpenGL läuft auf einer Vielzahl von Platformen. Während DirectX (sowie darauf basierende Schnittstellen wie DelphiX) auf Microsoft Windows beschränkt ist, wird OpenGL u.a. auch von Linux, FreeBSD und Macintosh unterstützt, was evtl. Portierungen erleichtert. OpenGL ist auch nicht nur auf PC sondern auch auf PDAs, Apple und einigen Consolen nutzbar. So ist die OpenGL Library bei Windows, MacOS X und Linux(gängige DistribUtionen) schon standardmäßig dabei und braucht nicht erst installiert werden.
OpenGL besteht aus einer Library und soll nur ein Ziel erreichen, nämlich eine gute und performante API für das Ansprechen der Grafikkarte und ihren Komponenten. Die Implementierung ist dementsprechend einfach, denn es existiert nur eine DLL im gegensatz zu der Librarysamlung von DirectX. Die Benennung der einzelnen Funktionen ist leicht herleitbar und übersichtlich. So fängt eine OpenGL Funktion immer mit GL... an und beschreibt dann die Funktionsart, wie z.B. Begin, End, BindTexture und weitere.
Hinter OpenGL steckt eine Firma namens SGI, die diese API 1992 veröffentlichte. Seither arbeiten an OpenGL zahlreiche Vertreter der Grafikindustrie wie Nvidia, ATI, IBM, HP und andere Groß- und Kleinunternehmen aus allen Branchen.
Im Gegensatz zu DirectX ist es den Grafikkartenherstellern mit OpenGL möglich, eigene Funktionen, die an die eigene Hardware angepasst ist, zu vorhandenen Befehlen mit in die Libary einzulagern (sogenannte Extensions). Dies ermöglicht bei Anwendung erhebliche Performancesteigerungen und kann mitunter sogar Features die sonst brach liegen zur Verfügung stellen. So kann man mit OpenGL die TrueForm Technik gut ausnutzen und ungewollte Aufwertung unterbinden.
Bei 2D-Anwendungen?
In den letzten Jahren sind 2D-Anwendungen mitunter sehr aus der Mode gekommen. Wer sich heutzutage ein Spielemagazin kauft und die Seiten durchblättert wird unter den Top-Titeln nahezu ausschließlich 3D-Titel finden. Doch nicht immer ist 3D auch wirklich notwendig bzw. bei einem Projekt sinnvoll. Bewußt möchten manche Autoren ein 2D-Spiel machen und greifen dabei schon fast aus Protest zu einer alten Schnittstelle. Aus diesem Grund geistern vermutlich noch soviele Leute durchs Netz und wenden DelphiX an, dass bereits auf eine DirectX-Version basiert, die seit graumer Zeit veraltet ist. Solange man nur wenige Bilder versucht auf dem Bildschirm zu zeichnen, scheint dies auch noch ausreichend zu sein. Allerdings kommt auf kurz oder lang dann doch die Frage auf, wie man die Performance verbessern kann. Gerade wenn es darum geht viele Objekte transparent zu zeichnen, kommt sehr schnell Frust auf, wenn die FPS-Rate in den Keller sinkt. Der Grund hierfür liegt dabei auf der Hand. Alte Schnittstellen verwenden nicht die neue Hardware und so kommt es dazu, dass die neue Grafikkarte nicht genutzt wird, sondern die Grafiken über die CPU geschleift werden. Wer also eine 2D-Anwendung erstellen möchte, sollte sich folgende Szenarien einmal zu herzen nehmen.
Pseudo-3D
Früher wurde versucht mit Hilfe einer isometrischen Engine eine 2D-Grafik so ausehen zu lassen als sei diese eigentlich dreidimensional. Ich denke jeder von Euch hat bereits einmal SimCity oder Jagged Alliance gesehen und kann sich in etwa vorstellen, was unter einer ISO-Engine verstanden wird. Eine solche Technik in der heutigen Zeit einzusetzen ist meistens eher hinderlich als produktiv. Man stelle sich nur einmal eine Figur darauf vor, die sich in mehre Richtungen bewegen kann. Für jede Bewegungsrichtung müßte man bei reinem 2D eine Grafik bereit halten (und sei es nur im Speicher). In einem 3D-Raum könnte man einfach ein Modell nehmen und dieses wirklich von mehren Seiten betrachten. Würde man nun auf die Idee kommen die Kameraeinstellung um nur wenige Grad zu drehen, würde dies einer kompletten Neuerstellung aller Grafiken zur Folge haben. Verwendet man statt dessen einen 3D-Raum mit einer Kamera, die nur nach oben, unten, links und rechts verschoben wird und ansonsten immer in einem festen Winkel auf das Spielfeld blickt, so erhält man einen ähnlichen Effekt wie bei einer isometrische Engine. Der Vorteil, dass zahlreiche mathematische Operationen nur im 2D-Raum berechnet werden müssen, bleibt ebenfalls weiterhin erhalten. Dafür werden die Grafiken allerdings weitesgehend von der GPU berechnet, und es werden zahlreiche transparente Effekte zugelassen.
Orthogonale Grafik
Doch selbst wenn man nur eine reine 2D-Grafik wünscht wie sie vor 15 Jahren noch üblich war, bietet es sich an eine moderne 3D-Schnittstelle wie OpenGL zu verwenden. Dies mag auf den ersten Blick nicht logisch erscheinen. Allerdings macht dies Sinn, wenn man sich bewusst wird, dass die Grafiken bei OpenGL über die GPU der Grafikkarte geschickt werden, die meistens um ein vielfaches leistungsfähiger als die CPU ist (und diese ja auch mit anderen Berechnungen wie z.B. der KI beschäftigt). Zeichnet man stattdessen ein Quadrat und klebt eine Textur in Form der gewünschten Grafik darauf, erhält man ebenfalls den gewünschten Effekt. Es mag nun kompliziert klingen in einem 3D-Raum Quadrate zu plazieren und zu texturieren. Man sollte allerdings wissen, dass es einen sogenannten orthogonalen Modus gibt in dem man bei einem 3D-Raum die Tiefe entfernt und somit wieder einen 2D-Raum erhält. Mit Hilfe des Tiefenbuffers kann man nun sogar noch die Z-Werte verwenden um die Zeichenreihenfolge der Quadrate zu bestimmen. Ein Tutorial zu Verwendung dieser Technik findet Ihr hier. Ausserdem sind alle nötigen Befehle hier in diesem Wiki (auf Deutsch) oder in euerer Delphihilfe (Englisch) bzw. im Netz (Englisch) dokumentiert.