Warum sollte ich glBindAttribLocation verwenden? [Duplikat]

8

In einer anderen Frage von mir gibt eine der Antworten an, dass ich glBindAttribLocation verwenden sollte und dem Shader-Compiler nicht erlauben soll, seine eigenen Indizes zuzuweisen. Ich frage mich, warum dies eine empfohlene Praxis ist, welche Vorteile hat es (oder vielmehr welche Nachteile hat es nicht)?

Ich verstehe, dass wenn ich mehrere Programme habe, die Attribute teilen, dies sinnvoll ist, da ich zwischen Programmen wechseln kann und diese Attribute nicht zurücksetzen muss. Für Attribute, die nicht freigegeben sind, oder wenn meine Programme diese Art der Freigabe nicht verwenden, sehe ich nicht, dass es notwendig ist, den Index explizit zu binden.

    
edA-qa mort-ora-y 21.08.2012, 08:46
quelle

1 Antwort

18

Zunächst denke ich nicht, dass es eine allgemeine Empfehlung ist, die explizite Bindung über glBindAttribLocation​ anstelle von glGetAttribLocation zu verwenden. Davon abgesehen, sind dies die Hauptgründe, warum ich glGetAttribLocation nicht mehr verwende:

Dies kann zu einem unnötigen Overhead führen. Alles scheint nett und gut, dass Sie einen lesbaren Namen anstelle von Zahlen verwenden können. "Was zum Teufel ist Attribut 7" vs "oh richtig, Attribut texture_coordinate": Ich werde zuerst erklären, was der mögliche Overhead sein kann und dann, warum dieser letzte Teil macht nicht einmal Sinn.

Wenn Sie den Attributspeicherort häufig benötigen, kann der Aufwand für den Aufruf von glGetAttribLocation abhängig vom Treiber nicht vernachlässigbar werden. Um den allgemeinen Fall zu behandeln, müssen Sie ein Caching-System erstellen. Großartig, da geht meine einfache und lesbare Methode mit Namen anstelle von Zahlen, ich musste einfach ziemlich viel nicht-trivialen Wrapper-Code schreiben. Schlimmer noch, du solltest wirklich darauf achten, dass du den Cache zerstörst, wenn das Programm ungültig wird. Es ist sehr wahrscheinlich, dass du das falsch machst und mit Fehlern behaftet bist. Also gingen wir von "gut lesbaren Namen" zu "schrecklichem Buggy-Chaos".

Mehr noch, das Argument 'schön lesbare Namen' ist fehlerhaft. Für im Shader definierte Positionen können Sie Folgendes perfekt machen:

%Vor%

Sie können auch einen assoziativen Container wie diesen verwenden:

%Vor%

Diesen kannst du auch mit glBindAttribLocation kombinieren, mach das einfach vor dem Verknüpfen:

%Vor%

Immer noch sehr gut lesbar, kein dynamischer Cache notwendig, nur einige statische Variablen, die sogar optimiert werden könnten.

Dann sagst du es selbst: es hat offensichtlich Vorteile, wenn du mehrere Programme verwendest, ich werde es hier nicht wiederholen, weil Kos erklärte das schon im Detail . Ich beantworte nur eines Ihrer Argumente:

Attribute, die nicht geteilt werden müssen : Dies bedeutet, dass es auch Attribute gibt, die geteilt werden müssen, wobei es ein großer Vorteil ist, dass Sie feste Orte verwenden. Warum würden Sie zwei Standortverwaltungsansätze in einer Anwendung kombinieren? Halten Sie sich von einem Maintenance-Kopfschmerz fern und bleiben Sie dabei, hier offensichtlich die vordefinierten Orte, weil Sie sie für die geteilten Attribute benötigen.

    
KillianDS 21.08.2012, 11:39
quelle

Tags und Links