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.
Antworten:
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.
quelle
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.
quelle
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):
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.
quelle
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.
quelle