Explizite oder automatische Attributbindung

7

Ich bin ein Anfänger in OpenGL und habe einige Nachforschungen zum Thema Shader und Attribute angestellt. Die meisten Orte, an denen ich gehe, sagen, dass eine explizite Attributbindung (ob im Shader selbst mit layout(location=x)oder mit glBindAttribLocation) besser ist, als OpenGL eine Attributnummer generieren zu lassen. Ich habe jedoch nicht vollständig verstanden, WARUM explizite Attributbindung besser ist.

Ich denke also, meine Frage ist, was sind die Vor- und Nachteile einer expliziten / automatischen Attributbindung und welche ist für ein besseres Programmdesign insgesamt förderlicher?

Chara
quelle
1
Im Prinzip denke ich, dass Automatik einen Vorteil hat: Wenn Sie denselben Vertex-Shader mit einer Vielzahl von Fragment-Shadern verwenden, werden einige Attribute möglicherweise nicht auf die Ausgabe eines bestimmten Pixel-Shaders übertragen, und der Compiler kann dies erkennen und die Anwendung informieren, wodurch eine Optimierung von ermöglicht wird das Scheitelpunktlayout. In der Praxis nutze ich dies nicht (aus einigen Gründen). Ich bin auch neugierig zu hören, was der Nachteil der Automatik ist ...
Daniel M Gessel
Die akzeptierte Antwort auf diesen Beitrag spricht für die pro-explizite Seite, vielleicht könnten Sie einen Blick darauf werfen, warum er so denkt. stackoverflow.com/questions/4635913/…
Chara
1
Wiederverwendung von VAOs mit mehreren Shadern, die dasselbe Scheitelpunktlayout verwenden. Wenn Sie den Compiler entscheiden lassen, benötigen Sie möglicherweise eine VAO für jede VB für jedes kompilierte Programm, selbst wenn sie genau dieselben Attribute verwenden. Klingt gut für mich! Ich sollte nachsehen, was Vulkan tut, jetzt wo die Spezifikation heraus ist ...
Daniel M Gessel

Antworten:

2

Es im Grunde gibt Ihnen die Kontrolle über die Semantik der einzelnen Attributindizes . Dies zahlt sich vor allem bei größeren Projekten aus, bei denen Sie viele verschiedene Shader haben, die jedoch häufig häufig verwendete Attribute verwenden, z. B. Positionen oder Texturkoordinaten. Mit expliziten Attributpositionen können Sie eine Semantik für diese Attribute erstellen und diese für alle Ihre Shader erzwingen , z. B. Positionen befinden sich immer in Attribut 0, Texturkoordinaten immer in Attribut 1, ...

Erstens hat dies den Vorteil, dass nicht der Attributindex für jeden Shader abgefragt werden muss . Natürlich können Sie es einmal abfragen und z. B. in einer Zuordnung von Attributnamen / Semantik zu Indizes speichern, aber dies vorher festzulegen ist noch besser. Und es bringt uns zu einem viel größeren Vorteil: Ohne explizite Attributbindung müssten Sie Vertex-Arrays eines Modells nicht nur für jedes Modell, sondern auch für jeden Shader an die einzelnen Attributkanäle binden , da Ihr Positionsarray möglicherweise auf Attribut 0 geht in einem Shader und Attribut 1 in einem anderen.

Dies ist nicht nur ein großer Aufwand, sondern zerstört auch den Vorteil von Vertey Array Objects (VAO) , die speziell dazu dienen, den gesamten Vertex-Attributstatus einschließlich der aktivierten Attributindizes und ihrer Pufferquellen zu erfassen, damit Sie Ihr Objekt zeichnen können indem Sie einfach die VAO binden und eine Zeichenfunktion aufrufen. Ohne ausdrückliche Attribut Bindung Sie würden immer noch zu reaktivieren / binden die einzelnen Arrays zumindest für jeden unterschiedlichen Shader haben Sie verwenden. Mit der expliziten Attributbindung wissen Sie, dass die Positionen Ihres Modells immer in den Attributindex 0 gehen .

Christian Rau
quelle