Beim Lernen der Grafikprogrammierung geht es um mehr als nur um das Lernen von APIs. Es geht darum zu lernen, wie Grafiken funktionieren. Vertex-Transformationen, Beleuchtungsmodelle, Schattentechniken, Textur-Mapping, verzögertes Rendern usw. Diese haben absolut nichts mit der API zu tun, mit der Sie sie implementieren.
Die Frage lautet also: Möchten Sie lernen, wie man eine API verwendet? Oder möchten Sie Grafiken lernen ?
Um mit hardwarebeschleunigten Grafiken arbeiten zu können, müssen Sie lernen, wie Sie mit einer API auf diese Hardware zugreifen. Sobald Sie jedoch die Möglichkeit haben, mit dem System zu kommunizieren, konzentriert sich Ihr Grafiklernen nicht mehr auf die Aufgaben der API, sondern auf Grafikkonzepte. Beleuchtung, Schatten, Bump-Mapping usw.
Wenn Sie Grafikkonzepte erlernen möchten, verbringen Sie weniger Zeit mit der API, als mit dem Erlernen von Grafikkonzepten . Das Kompilieren von Shadern hat nichts mit Grafiken zu tun. Sie wissen auch nicht, wie Sie Uniformen versenden, Scheitelpunktdaten in Puffer hochladen usw. Dies sind Tools und wichtige Tools für die Ausführung von Grafiken.
Aber sie sind eigentlich keine Grafikkonzepte. Sie sind ein Mittel zum Zweck.
Es erfordert viel Arbeit und Lernen mit Vulkan, bis Sie den Punkt erreichen, an dem Sie mit dem Erlernen von Grafikkonzepten beginnen können. Die Weitergabe von Daten an Shader erfordert eine explizite Speicherverwaltung und eine explizite Synchronisierung des Zugriffs. Und so weiter.
Das Erreichen dieses Punktes mit OpenGL erfordert dagegen weniger Arbeit. Und ja, ich spreche von modernen, Shader-basierten OpenGL-Kernprofilen.
Vergleichen Sie einfach, was nötig ist, um etwas so einfaches wie das Löschen des Bildschirms zu tun. In Vulkan erfordert dies zumindest einige Kenntnisse über eine Vielzahl von Konzepten: Befehlspuffer, Gerätewarteschlangen, Speicherobjekte, Abbilder und die verschiedenen WSI-Konstrukte.
In OpenGL ... es ist drei Funktionen: glClearColor
, glClear
und die plattformspezifischen Swap puffert Anruf. Wenn Sie moderneres OpenGL verwenden, können Sie es auf zwei glClearBufferuiv
reduzieren : und Puffer austauschen. Sie müssen nicht wissen, was ein Framebuffer ist oder woher sein Image stammt. Sie löschen es und tauschen die Puffer aus.
Da sich OpenGL viel vor Ihnen verbirgt, ist es weniger aufwendig, den Punkt zu erreichen, an dem Sie tatsächlich Grafiken lernen, als die Schnittstelle zur Grafikhardware zu erlernen.
Darüber hinaus ist OpenGL eine (relativ) sichere API. Es wird normalerweise Fehler ausgeben, wenn Sie etwas falsch machen. Vulkan ist nicht. Während es Debugging-Ebenen gibt, mit denen Sie helfen können, sagt Ihnen die Vulkan-Kern-API fast nichts, es sei denn, ein Hardwarefehler liegt vor. Wenn Sie etwas falsch machen, können Sie Müll rendern oder die GPU zum Absturz bringen.
In Verbindung mit der Komplexität von Vulkan wird es sehr leicht, versehentlich das Falsche zu tun. Wenn Sie vergessen, eine Textur auf das richtige Layout einzustellen, funktioniert dies möglicherweise in einer Implementierung, in einer anderen jedoch nicht. Das Vergessen eines Synchronisationspunkts kann manchmal funktionieren, aber dann plötzlich ohne ersichtlichen Grund fehlschlagen. Und so weiter.
Das Erlernen von Grafiken ist jedoch mehr als das Erlernen grafischer Techniken. Es gibt insbesondere einen Bereich, in dem Vulkan gewinnt.
Grafische Leistung .
Um ein 3D-Grafikprogrammierer zu sein, ist normalerweise eine Vorstellung davon erforderlich, wie Sie Ihren Code optimieren können. Und hier wird es zum Problem, wenn OpenGL Informationen versteckt und Dinge hinter Ihrem Rücken tut.
Das OpenGL-Speichermodell ist synchron. Die Implementierung darf Befehle asynchron ausgeben, solange der Benutzer den Unterschied nicht feststellen kann. Wenn Sie also ein Image rendern und versuchen, es zu lesen, muss die Implementierung ein explizites Synchronisationsereignis zwischen diesen beiden Tasks ausgeben.
Um jedoch eine Leistung in OpenGL zu erzielen, müssen Sie wissen, dass Implementierungen dies tun, damit Sie dies vermeiden können . Sie müssen erkennen, wo die Implementierung heimlich Synchronisierungsereignisse ausgibt, und dann Ihren Code neu schreiben, um sie so weit wie möglich zu vermeiden. Die API selbst macht dies jedoch nicht deutlich. Sie müssen dieses Wissen von irgendwoher erlangt haben.
Mit Vulkan ... sind Sie derjenige, der diese Synchronisationsereignisse ausgeben muss. Daher Sie müssen sich der Tatsache bewusst sein , dass die Hardware nicht ausgeführt Befehle synchron. Sie müssen wissen, wann Sie diese Ereignisse ausgeben müssen, und daher müssen Sie sich darüber im Klaren sein, dass sie Ihr Programm wahrscheinlich verlangsamen werden. Sie tun also alles, um sie zu vermeiden.
Eine explizite API wie Vulkan zwingt Sie dazu, solche Leistungsentscheidungen zu treffen. Wenn Sie die Vulkan-API kennenlernen, haben Sie bereits eine gute Vorstellung davon, welche Dinge langsam und welche schnell sein werden.
Wenn Sie einige Framebuffer-Arbeiten ausführen müssen, die Sie zwingen, einen neuen Renderpass zu erstellen, stehen die Chancen gut, dass dieser langsamer ist, als wenn Sie ihn in einen separaten Subpass eines Renderpasses einpassen könnten. Das bedeutet nicht, dass Sie das nicht tun können, aber die API teilt Ihnen im Voraus mit, dass dies zu einem Leistungsproblem führen kann.
In OpenGL lädt Sie die API grundsätzlich dazu ein, Ihre Framebuffer-Anhänge nach Belieben zu ändern. Es gibt keine Anleitung, welche Änderungen schnell oder langsam sein werden.
In diesem Fall können Sie mit Vulkan besser lernen, wie Sie Grafiken schneller machen können. Und es wird Ihnen sicherlich dabei helfen, den CPU-Overhead zu reduzieren.
Es wird noch viel länger dauern, bis Sie den Punkt erreichen, an dem Sie grafische Rendering-Techniken erlernen können.