OpenGL oder Direct3D
-
Hi
Ich schreibe seit bald einem halben Jahr C++.
Ich möchte jetzt endlich mal mit einer 3D-API programmieren und stehe jetzt vor der Frage: OpenGL oder Direct3D?
Was würded ihr mir vorschlagen? Wenn ich mich entschieden habe, kauf ich mir natürlich auch ein Buch.EDIT: Ich arbeite fix mit WinAPI und Winsock und werde deshalb auch nur auf Windows programmieren!
-
Jeder, der Länger bei der 3D-Programmierung dabei ist, wird später oder früher beide APIs kennenlernen - z. B. man will einen bestimmten Effekt mit D3D nachprogrammiern - findet aber nur guten OpenGL Democode - spätestens dann ist es vorteilhaft beide APIs zu kennen
Abgesehen davon wird mit beiden APIs das gleiche Stück Hardware angesteuert - das heißt die APIs haben sehr viele Ähnlichkeiten - z. B. Vertexbuffer, Texturen, Shader, Framebuffer usw. - wenn man das einmal verstanden hat dann ist es fast schon egal ob man D3D oder OpenGL benutzt - es immer das gleiche - es ist auch nicht so, dass man die APIs auswendig kennt - sondern man will etwas bestimmtes machen und weiß man braucht dazu einen Vertexbuffer und einen bestimmten Shader und dann guckt man in alten oder fremden Code nach wie das geht bzw. liest in der Doku nach - die Konzepte an sich sind gleich
Threads der Form OpenGL vs. Direct3D gibt es tausende - eventuell kannst du sogar einen sehr alten Thread von mir ausgraben, in dem ich mal die Frage gestellt habe, oder du liest einfach mal in der FAQ nach - deine Frage wurde schon 1000 Fach beantwortet - such nach den Antworten!
Eine weitere Lösung ist du schreibst dir einfach ein Interface Renderer, der dann einfach deine Schnittstelle für das Rendern bereit stellt - das Interface kann dann durch eine Konkrete Klasse implementiert werden, so dass du einmal eine D3D11 Implementierung und gleichzeitig eine OpenGL4.1 Implementierung hast
Einen Ansatz dafür kannst du hier finden http://www.humus.name/3D/Framework3.zipSieh dir einfach mal aktuelle D3D bzw. OpenGL Tutorials an und entscheide was dir von der Programmierung besser gefällt bzw. mit welchem Ansatz du besser zu recht kommst/besser verstehst/intuitiver für dich ist - dabei ist zu beachten das es von Direct3D zahlreiche verschiedene Versionen gibt - D3D9, D3D10, D3D11 dürften wohl die gängigsten derzeit sein - zwischen den verschiedenen Versionen hat sich einiges getan - ab D3D10 keine Fixed Pipeline mehr - ab D3D11 Tesselierung auf der GPU. Fast analog ist es bei OpenGL 2.0, OpenGL 3.3 und OpenGL 4.1
Dabei ist gleichzeitig die Frage ob du überhaupt D3D11 bzw. OpenGL 4.1 fähige Hardware besitzt, falls du mit den neusten Versionen arbeiten willst was ich dir empfehlen würde.
Ich mag persönlich gerne OpenGL weil es ein Rechtshändiges Koordinatensystem verwendet, die Matrizen Column Major sind und die negative z-Achse des Kamerakoordinatensystems in den Bildschirm "zeigt" - obwohl alle Grafikprogramme (3DS Max, C4D mit einen KS bei dem die z-Achse genau in die entgegengesetzte Richtung zeigt - gleichzeitig ist häufig die y-Achse mit der z-Achse vertauscht - wobei ich dann halt die y-Achse mit der z-Achse meine - ist doch einfach zu verstehen oder ;))
Eine Rolle spielt natürlich auch die Plattform für die man Programmieren will - soll das später auch mal auf der X-Box laufen was z. B. mit XNA gehen würde - aber die Fragen hast du schon beantwortet mit Windows.
Wenn du realistische Grafik haben willst dann ist Direct3D bzw. OpenGL total falsch. Dann solltest du die auf Offline Rendering spezialisieren und einen Path Tracer oder sonst was programmieren. In einem Paper von Anton Kaplanyan mit dem Titel "Light Propagation Volumes in CryEngine3" gibt es ein kurze Übersicht über gängigen Global Illumination Verfahren im Echtzeit Bereich - ich denke am Anfang ist es aber besser die Ideen hinter diesen Algorithmen beim programmieren eine physikalisch bassierten Renderers kennen zu lernen - unabhängig davon - du musst dir klar werden was du überhaupt machen willst - wenn du ein Spiel programmieren willst dann ist es unsinnig viel zeit mit Grafik APIs zu verschwenden - dann solltest du mehr Wert auf den Game-Code legen und für das Grafische Zeugs einfach ein 2D/3D-Bibliothek verwenden wie z. B. Ogre
Zu guter Letzt spielt auch noch eine Rolle welche Shader Sprache du verwenden willst HLSL, GLSL oder z. B. Cg.
-
DirectX. DirectX11 ist die schönste Render-API, die ich jemals benutzen durfte. Dagegen wirkt OGL (auf mich!) mit den ganzen globalen Funktionen und Extension wie ein Relikt aus Steinzeit. Da du nur für Win entwickelst, wäre mMn auch das EINZIGE Argument für OGL nichtig: Die Plattformunabhängigkeit.
Ich kann dir nur zu DX11 raten.
-
Das mit zu guter Letzt war gelogen
Ach ja Quaternionen, Perspektivische Projektion, Homogene Koordinaten. Wenn du hier ein Wort gelesen hast das du nicht verstanden hast bzw. mit dem du nix anfangen kannst dann ließ dich erst kurz in die Begriffe ein, bzw. stellt Fragen bevor du auch nur eine Zeile Code schreibst
- es ist sehr schmerzvoll ein Kamerasystem (z. B. Ghost Cam) zu implementieren wenn man nichts mit Matrizen anfangen kann - das heißt nicht das du erst ein paar Bücher über lineare Algebra und Quaternions lesen musst aber du solltest zumindest grob wissen warum Matrizen verwendet werden und zu was die gut sind - ich kann im Detail auch nicht sofort sagen warum die Algebraische Struktur der Quaternions genau so ist wie sie ist - aber ich kann sie verwenden - und praktisch einsetzen und weiß wie ich herausfinden kann ob die Werte meiner Quaternion völliger Unsinn sind oder ob sie in etwa stimmen können.
Ein großer Vorteil von D3D11 gegenüber OpenGL4.1 bzw. D3D vs. OpenGL ist, dass es für D3D ein Debug Tool namens Pix gibt - mit dem kannst du dir anschauen was in etwa auf der Grafikkarte gemacht wird - das spart sehr viel Zeit wenn man Fehler programmiert hat und verzweifelt versucht diese zu lokalisieren - Pix ist kostenlos - für OpenGL gibt es zwar auch auch ein Tool Namens gDEBugger aber das war bisher für Hobbyzwecke unbezahlbar - auf der Webseite von gDEBugger ist zu lesen "We plan to release a new and **FREE** gDEBugger version for Windows". Selbst wenn das Ding kostenlos ist denke ich nicht, dass es so gut wie Pix ist - die Screenshot von gDEBugger sehen so aus als ob die Debugging Möglichkeiten sehr eingeschränkt sind.
Schlusswort: Es ist nicht einfach zu sagen bzw. fast unmöglich welche API besser ist. Es gibt ein paar KO-Kriterien wie z. B. es soll auch auf Mac OS und Linux laufen - dann ist die API Frage einfach zu beantworten - aber wenn nur Windows in Betracht kommt sind die APIs gleich stark momentan. Das einzige Argument das mehr für D3D11 als für OpenGL4.1 spricht sind einfach die Debugging möglichkeiten - diese sind mit PIX einfach besser.
Literatur gibt es auch etwa gleich viel - es gibt zwar noch kein direktes OpenGL4.1 Buch aber Bücher zu OpenGL 3.x die einen großteil von OpenGL 4.1 abdecken. Es gibt Bücher zu D3D11 diese gehen aber meistens auch nur auf den Teil ein der schon in D3D10 vorhanden war und behandeln die neuen Möglichkeiten nur Oberflächlich (Compute Shader, Tesselierung) - da kann man in jedem Tutorial im Internet mehr darüber nachlesen als aktuell in Büchern - d. h. Literatur ist etwa gleich viel vorhanden. Zur Literatur, die nicht direkt D3D bzw. OpenGL behandelt sondern irgendwelche Effekte auf der GPU, wie z. B. die GPU Gems, ShaderX oder GPU Por Serie, kann ich nicht direkt etwas sagen - hier müsste man mal nachzählen ob sich die gezeigen Beispiele einfacher auf D3D11 oder OpenGL 4.1 zum laufen lassen bringen - oder ob das überhaupt keine Rolle spielt
-
@raspo
Ach ja vielleicht wäre noch eine Umfrage zu dem Thema angebrachtWelche Grafik API ist auch am liebsten?
D3D9.x und kleiner
D3D10.x
D3D11
OpenGL 2.0 und kleiner
OpenGL 3.x
OpenGL4.xdann hätten wir auch noch einen Wert was den Leuten hier im Forum im allgemeinen am liebsten ist - das verhindert hoffentlich auch Flamewars
hier gab es mal ein ähnliche Themen:
http://www.c-plusplus.net/forum/39424
http://www.c-plusplus.net/forum/39423
der letzte Thread kommt aus dem Jahre 2002 als die meisten noch keine Shader programmiet haben - es hat sich das seit dem einiges getan - daher erachte ich diesen Thread durchaus sinnvoll - den Thread kann man eigentlich jedes Jahr neu starten
-
Man müsste sich mal generell Gedanken machen welche Faktoren überhaupt eine Rolle spielen: Mir persönlich ist Dokumentation (vorhandene Anzahl von Büchern, Tutorials usw.) schon sehr wichtig. Plattformunabhängigkeit, Ausnutzung der Möglichkeiten aktueller Grafikkarten bzw. welches Shader Model bzw. Shader-Sprachen man benutzen will, usw. wären weitere Kriterien.
@EOutOfResources
das heißt du müsstest uns erst einmal sagen welche Kriterien dir wichtig sind und uns deinen subjektiven Bewertungsmaßstab geben damit wir objektiv bewerten können was besser ist. Dein Bewertungsmaßstab ist subjektiv weil dir es vielleicht besonders wichtig ist Fixed Function Pipeline und Shader parallel zu benutzen und das jemanden anderen total unwichtig ist weil der nur Shader nutze will. Dann kommt als Endergebnis für die Beste API für dich etwas anderes heraus als für jemand anderen.In Firmen ist es oft so - man kommt neu in die Firma - in der Firma wurde schon vor Jahren begonnen eine Anwendung zu programmieren. D. h. in diesem Fall stellt sich erst gar nicht die Frage welche API. Weil es Code im Umfang von z. B. 20 Mannjahren gibt der z. B. einfach OpenGL benutzt. Da kann man nicht schnell auf D3D11 umsteigen, selbst wenn man es wollt - einfach aus wirtschaftlichen Gründen.
Wenn du die großartige Möglichkeit hast ein neues Projekt zu starten in einem kommerziellen Umgebung, dann such man meisten ein ähnliches Open Source Projekt oder ein älteres ähnliches Projekt und übernimmt davon so viel wie möglich - oder sucht sich eine Fertige Engine/Framwork - aus wirtschaftlichen Gründen - dann erübrigt sich schon wieder die API Frage.
Die API Frage stellt sich fast nur für Hoppy Programmierer.
Weitere Kriterien, die mir spontan einfallen:
- Erlernbarkeit: Wie ist es die API zu erlernen - meiner Meinung nach gleich schwer/einfach
- Schnelligkeit beim Programmieren: Meiner Meinung nach gleich schnell vorausgesetzt man kennst sich vorher mit der API aus - z. B. Ein Shadow Mapping Demo zu programmieren dauert etwa gleich lang unabhängig ob man jetzt D3D oder OpenGL nutzt
- Performance: Spielt im Hoppybereich keine ernsthaften Probleme - hier kann man vereinfacht annehmen gleich schnellBTW: einfach 2D Spiele kann man z. B. mit SDL machen.
Also ums kurz zu machen: Benutz doch einfach Direct3D oder OpenGL - oder liefere einen subjektiven Bewertungsmaßstab nach dem wir dann objektiv beurteilen können - das wirst du aber wahrscheinlich alleine schon aus bequemlichkeitsgründen nicht machen
Jedenfalls habe ich jetzt das ultimative Todschlagargument für D3D vs. OpenGL: "Liefere einen subjektiven Bewertungsmaßstab nach dem wir dann objektiv beurteilen, ob für dich besser D3D oder OpenGL sinnvoll ist".
Problem dabei ist halt wenn du keine Ahnung von nichts hast
- was eigentlich immer so am Anfang ist - man weiß halt nicht was eine Fixed Pipeline oder ein Shader ist und kann daher keinen Bewertungsmaßstab liefern - könnte man eine liefern würde man erst gar nicht die Frage D3D vs. OpenGL stellen. Jedenfalls denke ich du stehst jetzt das erste mal vor dem Problem "wie zeichne ich ein Dreieck auf den Bildschirm". Und das erste Problem über das man stolpert nachdem man ein Fenster für die Ausgabe hat ist welche API man benutzen soll. Ich hab damals als erstes OpenGL benutzt - weil damals als ich noch jung war die Nehe Tutorials gerade voll im Trend waren - daher bin auch auch heute noch so zu OpenGL verbunden - aufgrund meiner Erfahrungen in der führen Kindheit
hehe - heute kann man die Nehe Tutorials vergessen weil die alle fast < OpenGL 2.0 sind und das keine mehr programmieren will.
Jetzt stehen wir als alte "Hasen" da und sollen dir einen Tipp geben ob du D3D oder OpenGL nutzen sollst. Wir wissen aber dass die Frage erst Sinn macht wenn du Ahnung hast (Wissen über Shader, usw.) - die du aber momentan (anscheinend) noch nicht hast - also sagen wir dir im Regelfall einfach was unsere persönliche Lieblings API ist und wissen insgeheim das du eines Tages selbst eine Antwort auf die Frage finden wirst wenn du eine API einfach ausprobiert hast. Wenn dann noch jemanden etwas gegen unser Lieblings API sagt wie z. B. "so viel Aufwand mit Extensions" dann reagieren wird meistens mit bösen Antworten was zwangsläufig zu einem Flamewar führt
Du musst deine eigenen Fehler machen! Wir nehmen dir hier die Entscheidung nicht ab: Benutze OpenGL - hehe - jetzt hast du eine Empfehlung für D3D und für OpenGL - ja dumm gelaufen - bist genau so weit wie am Anfang - wie gesagt mach deine eigenen Fehler - musst du jetzt auch zwangsläufig weil der eine Links und der andere Rechts sagt - es gibt halt nicht immer ein Richtig oder ein Falsch - am besten du suchst dir einfach ein Buch bzw. Tutorial das dir am besten gefällt und benutzt dann einfach halt die API die dort verwendet wird. Aus pasta fertig.
Wenn du die Geduld hattest alles durchzulesen was ich geschrieben habe, dann denke ich wirst du das schon hinbekommen.
-
Es ist eigentlich ganz einfach: Wenn du die Wahl hast, definitiv D3D
-
gDEBugger ist jetzt doch kostenlos (eventl. nur für Hobbyzwecke)
http://www.gremedy.com/purchase.phpBin gerade am Testen was mit gDEBugger möglich ist:
- Depth, Stencil, Back, Front Buffer anzeigen, benötigter Speicher
- Texturen anzeigen, benötigter Speicher
- FBOs anzeigen - z. B. ob die Shadow Map richtig gerendert wurde
- Alle State Variblen mit aktueller Belegung
- Anzeige welche gl* Aufrufe insgesammt wie oft dran waren
- Profiling Möglichkeiten (temporäre Abschaltung von Fragment oder z. B. Geometrie Shader um Bottleneks aufzugziegn) - fürs Profiling schient gDEBugger besser zu sein wie Pix
- Anzeige von Deprecated Functions <- sehr hilfreichWas nicht geht:
Rechtsklick auf einen Pixel z. B. im Framebuffer oder z.B. FBO und dann "Debug Pixel" wie in PixWas ich noch nicht verstanden habe und am wichtigsten ist:
welchen Wert hat welcher Shaderparamter - das Debugging von Shadern hab ich noch nicht kapiert - nutze auch Cg vielleicht hat der Debugger damit ja Probleme...
-
dot schrieb:
Es ist eigentlich ganz einfach: Wenn du die Wahl hast, definitiv D3D
ich finde ja eigentlich die OpenGL 4.0 Api ganz hübsch. Ich bin zwar jetzt nicht so tief drin in der API, aber bislang empfand ich immer nur die Doku als Problem, nicht das Interface selber. Vor allem das Statemachine Design ist sehr ansprechend und verträgt sich mMn sehr gut mit C++ Klassen. Nachteil ist natürlich, dass OpenGL etwas low-leveliger ist und wo man in D3D nur einen Call hat, hat man dort direkt 5, dafür muss man sich aber auch nicht mit so vielen Datenstrukturen rumschlagen.
-
Hier die OpenGL 4.1 Reference Card - damit man ein Gefühl bekommt wie die API zu bedienen ist:
http://www.khronos.org/files/opengl41-quick-reference-card.pdfZum Dokumentationsproblem:
Man muss sich halt hier ein Buch wie "OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 3.0 and 3.1" kaufen - Version 3.0 ist sehr ähnlich zu 4.1 - direkt zu OpenGL 4.1 gibt es noch kein BuchIch nutze oft
http://wiki.delphigl.com/index.php/OpenGL-Funktionsübersicht
um herauszufinden welche Paramter welchen Sinn haben - ist zwar für die Programmiesprche Delphi - aber die Paramter sind genau so wie bei C++ - nur eine etwas ander Syntax
-
Hi
Erstmal vielen vielen Dank für die tolen Antworten! Super Forum, super Mitglieder!
Ich hatte ein Problem mit meinem Router und konnte deshalb nicht antworten. Ich habe jetzt alles durchgelesen und es sind viele interessante Argumente von beiden Seiten gekommen (Direct3D & OpenGL).Ich hab mir mal ein paar Beispiele angeschaut. Alleine von Stil der API her ist es mir egal welche ich benutze.
Was mich jedoch überzeut hat ist, dass ich mir eine eigene Schittstelle schreibe. Ich habe schon mit den WinAPI- und den WinGDI-Teilen der Schnittstelle begonnen.
Vertexwahn schrieb:
Zu guter Letzt spielt auch noch eine Rolle welche Shader Sprache du verwenden willst HLSL, GLSL oder z. B. Cg.
Keine Ahnung welche ich nehmen sollte...
Und noch was: Ich habe die Wahl, was ich nehme.
Mein Zielgebiet wird einfach nur ein Einstieg in die 3D-Programmierung sein. Ich möchte mal Low-Level schreiben und die API's verstehen. Deshalb werd ich ganz sicher keine fertige Engine nutzen. es soll ja auch nicht ein Spiel werden.
Ich würde bis jetzt du Direct3D tendieren aber ist es falsch beides parallel zu lernen? Ich meine, dann habe ich am Schluss die Kontrolle über zwei API's ohne sehr viel mehr Arbeit investiert zu haben...
Und noch was zum Bewertungsmassstab. Wenn ich einen bestimmten Effekt realisieren möchte, ist es mir egal, wie viel Zeilen oder Zeit ich gebraucht habe. Wie einfach eine API ist, ist mir auch egal. Mir kommt es auf ein Endergebnis an, nicht auf dn weg dorthin (natürlich hat Alles Grenzen).
MfG und nochmals vielen Dank für deine Mühe,
EOutOResources
-
Wenn dir das alles egal ist, warum fragst du dann?
-
Mir ist nicht Alles egal, ich möchte wissen, mit welcher API man besser anfängt/in die 3D-Programmieung kommt...
-
Ich würde bis jetzt du Direct3D tendieren aber ist es falsch beides parallel zu lernen? Ich meine, dann habe ich am Schluss die Kontrolle über zwei API's ohne sehr viel mehr Arbeit investiert zu haben...
Das ist ein Trugschluss.
-
Wenn du es dir aussuchen kannst würde ich dir zu D3D raten weil es die imo bei weitem bessere API hat, auch wenn beide gleich mächtig sind. Je nachdem wieviel Erfahrung du hast kannst du mit D3D9 oder D3D11 anfangen. Da D3D9 eine flachere Lernkurve hat und es atm noch viel mehr Material dazu gibt ist es für Anfänger evtl. besser geeignet als D3D11. Wenn du allgemein schon mehr Erfahrung hast und kein Problem damit dir Informationen auch aus einer Doku zu beschaffen kannst du auch gleich mit D3D11 anfangen.
-
Du hast also noch nichts mit OpenGL oder D3D gemacht, aber willst zum reinstarten gleich eine eigene API machen, die beide abstrahiert?
Mein Tip: Zuch dir eine der beiden APIs aus. (Wenns sein muss mit dem Würfel)
Und dann Programmiere ein kleines Spiel oder überhaupt mal irgendwas auf den Bildschirm. Dann hast du deinen Einstieg. Alles andere kannst du danach entscheiden.
-
Wenn du es dir aussuchen kannst würde ich dir zu D3D raten
Wenn du es dir aussuchen kannst, dann wuerde ich zu OpenGL raten.
weil es die imo bei weitem bessere API hat
Da wuerde ich gern mal Zahlen sehen ...
-
knivil schrieb:
Da wuerde ich gern mal Zahlen sehen ...
Wenn du mir erklärst wie man die Qualität einer API in Zahlen messen kann dann kann ich dir vielleicht eine Antwort drauf geben
-
So, hab mir in OpenGL mal ein bischen Praxiszeug angeschaut und habe mich jetzt entschlossen OpenGL zu lernen.
Ich habe OpenGL ausgewählt weil ich OpenAL bereits kannte und mochte und weil geschreiben wurde, dass Direct3D und OpenGL gleichmächtig ist. Somit habe ich ein mit D3D gleichmächtiges Tool, welches einfacher zu lernen ist. Und was ich auch noch schön fand, ist wie leicht man die OpenGL-Pipeline modifizieren kann. Ein bischen Extention und ich habe einen nutzbaren Vertex- und Fragmentshader.
Das Buch ist schon unterwegs.Vielen Dank @ all.