2016-09-17 4 views
3

Kürzlich begann ich vulkan API zu lernen, gibt es einige Themen, die mich verwirrt, meine Frage ist, was ist ein Render-Durchlauf, warum es gleichzeitig mit dem Befehl Pufferaufzeichnung verwendet? und was sind Subpass, Sub Pass Abhängigkeiten und Attachments? die normalerweise mit render pass verbunden sind.verwirrt über Render-Durchlauf in Vulkan API

+0

Was meinst du mit "courcurently"? – krOoze

+1

Ihre Frage ist zu breit. Es ist, als würde man fragen "Was ist eine Textur" oder "Beschreibung der Rendering-Pipeline". Ich könnte drei Blogposts auf dem Render-Pass-System und der Architektur schreiben. –

+0

@krOoze Ich weiß nicht, ob das der richtige Begriff ist, was ich meine, dass es allgemein mit der Befehlspufferaufnahme verwendet wird. – BulBul

Antwort

8

Es ist die einzige Möglichkeit, etwas gezeichnet zu bekommen (Zeichenbefehle können nur innerhalb des Render-Durchlaufs sein). Überlege es also nicht. Als Anfänger müssen Sie nur einen Render-Pass mit einem (obligatorischen) Subpass erstellen und das war's. Sie können die Tiefen später verstehen.


Auch sollten Sie eine Chance für all jene Videos und Tutorials geben, die ausführlich geschrieben und mit mehr Sorgfalt als was auch immer jemand hier in kurzem SO-Format schreiben.

Geben Sie der spec eine Chance (es ist nicht so schlecht —, aber vermeidet redundante semantische und konzeptionelle Informationen). Versuchen Sie, some intro by AMD, vulkan-tutorial.com, Vulkan in 30 minutes zu lesen (dieser half mir trotzdem gestartet — gut gab es nicht viel mehr zu der Zeit verfügbar), API without secrets und Uhr z. Vulkan GDC Sitzung Part1, Part2.

Jetzt haben Sie einige Leute dahinter gehört und einige Befehle gesehen. Sie sollten mit spezifischeren Aspekten, die Sie nicht verstehen, zu uns zurückkehren.


OK, ich werde nur eine konzeptionelle Beschreibung hier hinzufügen, um die Frage formell zu beantworten.

Render pass ist eine Art Beschreibung oder eine Karte oder ein Schema eines Grafikjobs (der sich um bestimmte Organisation/Verwendung von Bildressourcen dreht). Aber es beschreibt nicht die tatsächlichen Befehle noch die aktuellen Ressourcen (das in dem Befehlspuffer Aufnahme machen getan wird für Pass Instanz zwischen vkCmdBeginRenderPass() und vkCmdEndRenderPass())

Vielleicht eine „black box“ oder „C++ wie Deklaration“, für die Sie Bereitstellung später ist eine gute Analogie.

Render-Durchlauf hat einen Satz von Anlagen. Betrachten wir sie als Beschreibungen der benötigten Frame-Bild-Ausgaben und -Provisorien (aber nicht der spezifischen Frame-Bilder selbst).

Render-Pass hat einen Satz von Unterpassagen. Subpass beschreibt, wie ein Anhang während seiner Ausführung behandelt wird (z. B. als Farbpuffer in einem Farbbildlayout).

Render-Durchlauf hat einige Sätze von Subpass Abhängigkeiten. Abhängigkeiten beschreiben die Ausführungsreihenfolge zwischen Subpässen (es bildet eine Abhängigkeits-DAG). Die Abhängigkeit beschreibt auch ein Äquivalent einer Pipeline-Barriere zwischen zwei Subpässen oder zwischen einem Subpass und außerhalb des gesamten Render-Durchgangs (VK_SUBPASS_EXTERNAL Abhängigkeit). Subpässe werden in beliebiger Reihenfolge ausgeführt und können sich (in der Freizeit des Treibers) überschneiden, außer was Sie in den Abhängigkeiten beschreiben (oder anderweitig synchronisieren).

In Befehlspuffer vkCmdBeginRenderPass() mit Ihnen erstellen Pass Instanz machen (Sie aktuelle Bilder für die Anlagen mit VkFramebuffer, und die tatsächlichen Befehle zur Verfügung stellen, die sie schreiben).

Die Dinge, die Teil der Render-Durchlaufbeschreibung sind, werden automatisch ausgeführt (die Bild-Layout-Übergänge, Barrieren und MSAA-Auflösungen).

Für den Rest notieren Sie die Befehle für Subpässe der Renderpass-Instanz für die aktuelle CB. Sie tun es sequentiell für Subpass 0, 1, 2, 3, 4, ... — das ist nicht was die tatsächliche Ausführungsreihenfolge sein wird, obwohl — Sie das mit den Subpass-Abhängigkeiten beschrieben haben (und ansonsten zur freien Verfügung steht der Fahrer).

Dann der Befehlspuffer mit solchen Render-Durchlauf Instanc (es) wird an die Warteschlange übergeben und tatsächlich ausgeführt wird.
Es ist vielleicht diese Umleitungen, die es schwieriger zu begreifen machen. Befehle werden aufgezeichnet, bevor sie überhaupt ausgeführt werden. Und Render-Pass wird erstellt, bevor es überhaupt aufgezeichnet wird. :)

+0

so nur um sicherzustellen, wenn ich es richtig mache, ist ein Render-Durchlauf eine Art Blaupause, die alle Teile/Stücke zusammen, später, wenn Befehle an die Befehlswarteschlange übergeben werden, wird das beabsichtigte Bild gezogen werden Bezug nehmend auf diesen Bauplan, und wenn Sie mir eine bessere Analogie zum Rendern geben könnten, wird mir alles klarer. – BulBul

+0

Wir geraten in das Land der gefährlich irreführenden Metaphern. Ich habe versucht, in der Antwort darauf hinzuweisen, dass man es nicht unbedingt verstehen muss, um es zu benutzen. So etwas wie Quantenphysik. Punkt ist, liefern Sie, was jeder Befehl will und es wird einfach funktionieren. – krOoze

+0

Mein Favorit ist die "Black Box" oder eine "C++ Like Header Deklaration". Mit renderpass deklarieren Sie die Typen einiger Ein- und Ausgänge und benötigte Provisorien und eine Schnittstelle (im Fall von Render übergeben Sie auch ein Schema des gesamten Algorithmus). Mit 'vkCmdBeginRenderPass' und' vkEnd * 'erstellen Sie eine Instanz des Renderpasses in einem bestimmten CB. Sie tun dies, indem Sie tatsächliche Bilder für die Ausgaben/Anhänge bereitstellen. Und dann liefern Sie auch den eigentlichen Algorithmus/die Implementierung. – krOoze