Ist es wichtig, ob ich OpenGL oder Direct3D lerne?

11

Sind die Unterschiede zwischen diesen beiden APIs geringfügige Implementierungsdetails, die bedeuten, dass ich sie für alles verwenden kann, sobald ich eine gelernt habe? Oder gibt es Gründe, das eine und nicht das andere zu lernen, wenn ich es generell verwenden möchte, ohne in Zukunft eine andere API neu lernen zu müssen? Ist der eine oder andere allgemeiner?

Insbesondere möchte ich für jede Grafikkarte schreiben können, sodass der Code nicht nur auf den Karten eines bestimmten Herstellers oder einem bestimmten Modell ausgeführt werden kann. Ich möchte auch in der Lage sein, Code zu schreiben, der auch ohne Grafikkarte funktioniert (wenn auch langsamer).

Gibt es einen Unterschied darin, wie portabler Code auf verschiedenen Plattformen (Betriebssystemen / Architekturen) sein wird? Ich bin an der Verfügbarkeit anderer Bibliotheken interessiert, die mit diesen arbeiten, und daran, ob die eine oder andere zu weniger Lizenzbeschränkungen in ihrer weiteren Umgebung führt. Alles Messbare, das einen Unterschied machen würde, ob eines davon das einzige sein könnte, das ich lerne, ohne mich einzuschränken.

Trichoplax
quelle
2
Die Antwort des Ratschenfreaks ist gut. Wenn Sie Direct3D lernen möchten, können Sie mein kostenloses Buch "The Direct3D Graphics Pipeline" lesen . Die API-Details sind meistens Direct3D9, aber die Konzepte sind dieselben. Die Konzepte für die Programmierung von 3D-Grafiken haben sich seit den späten 1960er Jahren nicht wirklich geändert. Die APIs zum Ausdrücken dieser Konzepte sind viel intelligenter geworden.
Legalisieren Sie den

Antworten:

9

Ich denke nicht, dass es wichtig ist, welche API Sie verwenden möchten, wenn Sie sich auf "Programmgrafiken" stützen. Wichtiger sind die typischen Konzepte, die Sie beim Arbeiten mit 3D-Szenen verwenden. Sie möchten beispielsweise lernen, wie Sie ein einfaches (und später komplexeres) Szenendiagramm schreiben. Diese Konzepte sind viel wichtiger als die spezifischen API-Methodennamen, die Sie aufrufen müssen.

Vergleichen Sie es, wenn Sie lernen, wie man Programme schreibt. Wenn Sie gut darin sind, Programme in z. B. Java zu schreiben, werden Sie nicht so viele Probleme haben, C ++, Objective-C, Swift oder eine andere objektorientierte Sprache zu lernen. Weil es die Konzepte und das Denken sind, die Sie lernen.

Die Wahl zwischen OpenGL, Direct3D und Metal ist in erster Linie die Wahl, auf welches Betriebssystem Sie abzielen. Direct3D ist hauptsächlich unter Windows, Metal unter OS X und iOS verfügbar, und OpenGL wird auf den meisten Systemen unterstützt, einschließlich OS X, iOS, Windows und Linux.

Die Grafikkarte hat wahrscheinlich wenig bis gar keinen Einfluss auf diese Entscheidung, da ich keine Karte kenne, die nur eine oder zwei unterstützt. Wenn Sie keine dedizierte Grafikkarte haben, wird das Rendern in Echtzeit bald ein Problem sein. Obwohl ein Intel HD Graphics und der AMD-Begleiter schon ziemlich viel können.

Wählen Sie also Ihre Plattform.


Haftungsausschluss: Bisher habe ich weder Direct3D noch Metal verwendet.

Nero
quelle
2
> "Wenn Sie ziemlich gut darin sind, Programme in z. B. Java zu schreiben, werden Sie nicht so viele Probleme haben, C ++ zu lernen" - das ist nicht wahr. Jeder wird kolossale Probleme beim Lernen und Verwenden von C ++ haben. Ein Vergleich mit Java oder einer anderen sicheren Sprache ist völlig unangemessen. Für andere von Ihnen aufgeführte Sprachen (Objective-C, Swift oder eine andere objektorientierte Sprache) ist diese Aussage jedoch meistens richtig.
Anzeigename
9

Wir befinden uns derzeit in einem Übergang von API-Paradigmen.

Die Methode der alten Schule, Puffer, Uniformen, Attribute, Layouts und Programme als (impliziten) globalen Status zu binden und Draws mit diesem Status zu versenden, ist in D3D11 und OpenGL üblich. Es hat jedoch einen großen Overhead (bei der Überprüfung des Status und wenn man nicht weiß, was das Programm bis zur letzten Minute tun möchte). Sie sind auch (größtenteils) nicht threadsicher.

Aus diesem Grund sind neue Apis auf den Markt gekommen (oder kommen bald), D3D12, wobei Vulkan und Metal die bekanntesten sind. Diese APIs geben dem Programm mehr Kontrolle und ermöglichen es ihm, im Voraus zu deklarieren, was es mithilfe von Befehlspuffern tun möchte. Sie können damit auch Ihre eigenen Ressourcen (Scheitelpunktdaten, Texturen, ...) viel direkter verwalten. Die Verwendung mit mehreren ist viel einfacher.

Die Wahl zwischen alt und neu hängt davon ab, wie gut Sie den zugewiesenen Videospeicher verwalten und den Befehlspuffer erstellen können.

  • Wenn Sie etwas möchten, das auch auf älterer Hardware "nur funktioniert", sind die APIs der alten Schule besser. Sie sind auch besser bekannt und Sie erhalten online mehr Hilfe.

  • Auf der anderen Seite, wenn Sie mit der Asynchronität von Dispatching-Befehlen umgehen können und es Ihnen nichts ausmacht, alle von Ihnen zugewiesenen Puffer zu verfolgen. Dann könnten die neuen APIs etwas für Sie sein.

Ratschenfreak
quelle
6
Die neuen expliziten Grafik-APIs sind nicht wirklich für den Verbrauch durch den durchschnittlichen Grafikprogrammierer konzipiert, sondern eher für Personen, die Infrastrukturarbeiten in Engines ausführen, oder für diejenigen, die die Leistung wirklich benötigen. Sie geben dir eine viel größere Waffe und richten sie direkt auf deinen Fuß.
Porglezomp
3

Ich persönlich denke nicht, dass es wichtig ist. Wählen Sie einfach eine aus, die zu Ihrem Projekt passt. Ich habe in der Vergangenheit sowohl D3D als auch OpenGL verwendet. Auf die Konzepte kommt es an. Was auch immer Sie greifen, Sie müssen verstehen (zum Beispiel):

  • Was sind Texturen und wie werden sie von der GPU verwendet?
  • Grundlegende Konzepte der Grafikentwicklung (Eckpunkte, Grundelemente, Fragmente usw.)
  • Wie funktioniert das Kamerasystem (MVP-Matrizen in OpenGL zum Beispiel)?
  • Was sind Shader und wie man sie richtig benutzt.
  • Wie unterschiedlich eine GPU von der CPU Ihres Computers ist.
  • Was sind die Unterschiede zwischen dem Speichermodell der GPU und dem Speichermodell der CPU?
  • Was sollte auf der CPU getan werden und was sollte zur Verarbeitung auf die GPU ausgelagert werden?

Wie bereits erwähnt, befinden wir uns mitten im Übergang zu einem neuen Satz von APIs (Vulkan, Metal usw.). Wenn Sie also noch nicht mit der Grafikentwicklung vertraut sind, ist es seit Vulkan wahrscheinlich eine gute Idee, sich auf GLSL zu konzentrieren wird es auch ausnutzen.

In Bezug auf die Portabilität ist D3D nur Windows (Es gibt Gerüchte, dass das Wine- Projekt versucht, D3D unter Linux zum Laufen zu bringen, aber bisher nichts machbares). OpenGL ist plattformübergreifend. Wenn Sie mobil werden möchten, ist OpenGL ES eine verfügbare Option. Natürlich haben sowohl OpenGL als auch OpenGL ES unterschiedliche Versionen, die nicht von allen Plattformen unterstützt werden.

Letztendlich greifen alle APIs auf dieselbe Hardware auf Ihrem Computer zu. Es kommt nur darauf an, wie sie darauf zugreifen.

Sepehr
quelle
Direct3D ist auch das, was Sie verwenden würden, wenn Sie für eine der Xbox-Konsolen programmieren.
Legalisieren Sie den
Was meinst du mit "nichts machbar"? Wine führt seit Jahren Hunderte von D3D-basierten Programmen ohne Probleme aus. Natürlich gibt es Fehler und nicht implementierte Teile, aber das macht die gesamte API nicht unbrauchbar.
Ruslan
0

Ich werde ein paar Worte zum Rendern ohne Grafikkarten sagen.

Weder OpenGL noch DirectX benötigen wirklich eine Grafikkarte. Eine Implementierung kann vollständig softwarebeschleunigt sein.

Für OpenGL unter Linux gibt es den Mesa Software Rasterizer. Nach meiner Erfahrung funktioniert es in Ordnung, solange Sie nicht zu viel Druck machen, um seltsame Funktionen (Anzeigeliste + indizierte Scheitelpunkt-Arrays) zu kombinieren. Ich stelle mir vor, dass ihre Liste der tatsächlichen Fehler meilenweit ist. Stellen Sie sicher, dass Sie kontinuierliche Tests durchführen!

Ich habe weniger Erfahrung mit OpenGL unter Windows. Antwort bearbeiten, wenn Sie etwas wissen!

DirectX SDK wird mit einem Software-Rasterizer namens "Referenz-Rasterizer" geliefert. Meiner Meinung nach dient es hauptsächlich dem Debuggen, aber ich kenne mindestens einen Freund, der den Referenz-Rasterizer verwendet, wenn er DX11 auf einem DX10-fähigen Laptop entwickelt. Wie in anderen Antworten erwähnt, ist DirectX nur Microsoft.

Andreas
quelle
Nach meiner Erfahrung sollte die Verwendung einer integrierten Grafikkarte für die meisten OpenGL-Entwicklungen unter Windows ausreichend sein. Stellen Sie jedoch sicher, dass sie eine aktuelle OpenGL-Version unterstützt.
Akaltar