2012-08-21 30 views
8

Mögliche Duplizieren:
Explicit vs Automatic attribute location binding for OpenGL shadersWarum sollte ich glBindAttribLocation verwenden?

In einer anderen Frage von mir eine der Antworten zeigen, ich glBindAttribLocation und nicht zulassen, dass der Shader-Compiler verwenden, sollte seine eigene Indizes zuzuordnen. 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.

+0

tl; dr keine große Sache. Diese Funktion _might_ ist praktisch, aber es ist keine große Sache. Ich kann nicht sehen, wie es eine * empfohlene Praxis * sein könnte, Quelle? – Kos

+2

Sie haben es bereits selbst beantwortet. So können Sie Programme teilen ein paar vordefinierte Attribute und Sie können Programme wechseln oder sogar für verschiedene Objekte usw. verwenden. In der Praxis finde ich dies einen großen Vorteil. – Invalid

+0

Ich habe 'glBindAttribLocation' nicht in meiner Grafik-Engine verwendet, was auf Linux gut funktioniert. Wenn ich nach Windows portierte, benutzte es meine Normalen als Vertices - ich musste ihm explizit die Reihenfolge der Variablen über 'glBindAttribLocation' mitteilen, damit es funktioniert ... – Jarrett

Antwort

18

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

Erstens kann dies unnötigen Overhead verursachen. 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 häufig den Standort des Attributs benötigen, kann der Aufwand für das Aufrufen von glGetAttribLocation je nach Treiber nicht unerheblich 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 "schön lesbaren Namen" zu "schrecklichem Buggy-Chaos".

Noch mehr, das Argument 'schön lesbare Namen' ist fehlerhaft. Sie können durchaus so etwas wie die im Shader definiert für Standorte folgende tun sich:

const GLint vertex_loc_att = 0; 
const GLint texture_coord_att = 1; 
... 

Oder Sie können auch einen assoziativen Container wie folgt verwenden:

attribute_locations["vertex_location"] = 0; 
attribute_locations["texture_coordinate"] = 1; 
... 

Dieses Sie auch mit glBindAttribLocation kombinieren, nur dies tun vor Verlinkung:

foreach name, location in attribute_locations 
{ 
    glBindAttribLocation(program_id, location, name); 
} 

noch sehr gut lesbar, keine dynamischen Cache erforderlich, um nur einige statische Variablen, die auch bekommen könnte optimiert weg.

Dann sagst du es selbst: es hat offensichtlich Vorteile bei der Verwendung mehrerer Programme, ich werde es hier nicht wiederholen, denn Kos explained that one in detail already. Ich werde nur eines Ihrer Argumente beantworten:

Attribute, die nicht brauchen teilen Das bedeutet, es gibt auch Attribute, dass die Notwendigkeit, gemeinsame Nutzung, für die es ein großer Vorteil ist, dass Sie festen Standorten verwenden. Warum würden Sie zwei Standortverwaltungsansätze in einer Anwendung kombinieren? Halten Sie sich von einem Maintenance-Kopfschmerz fern und bleiben Sie bei einem, hier offensichtlich den vordefinierten Orten, weil Sie sie für die geteilten Attribute benötigen.

+4

Macht es Sinn, dass man auch einen 'glBindUniformLocation' möchte? '? Ich frage, da deine Argumentation auch darauf zutrifft, aber keine solche Funktion ist im Standard. –

+1

glBindUniformLocation Funktionalität wurde in 4.3 hinzugefügt, durch eine Layout-Anweisung im Shader: http://www.opengl.org/wiki/Uniform_(GLSL)#Explicit_uniform_location –

Verwandte Themen