Ich kenne einen guten Grund, eine explizite Standortdefinition zu bevorzugen .
Beachten Sie, dass Sie Ihre Geometriedaten in Vertex-Array-Objekten speichern . Für ein bestimmtes Objekt erstellen Sie eine VAO so, dass die Indizes beispielsweise Folgendes entsprechen:
- Index 0 : Positionen,
- Index 1 : Normalen,
- Index 2 : Texcoords
Stellen Sie sich nun vor, Sie möchten ein Objekt mit zwei verschiedenen Shadern zeichnen . Ein Shader benötigt Positions- und Normaldaten als Eingabe, der andere - Positionen und Texturkoordinaten .
Wenn Sie diese Shader kompilieren, werden Sie feststellen, dass der erste Shader die Positionen bei Attributindex 0 und Normalen bei 1 erwartet. Der andere erwartet Positionen bei 0, aber Texturkoordinaten bei 1.
Zitieren von https://www.opengl.org/wiki/Vertex_Shader :
Automatische Zuordnung
Wenn keine der beiden vorherigen Methoden einem Attributindex eine Eingabe zuweist, wird der Index automatisch von OpenGL zugewiesen, wenn das Programm verknüpft wird. Der zugewiesene Index ist völlig willkürlich und kann für verschiedene verknüpfte Programme unterschiedlich sein, selbst wenn sie genau denselben Vertex-Shader-Code verwenden.
Dies bedeutet, dass Sie Ihr VAO nicht mit beiden Shadern verwenden können. Anstatt beispielsweise eine VAO pro Objekt zu haben, benötigen Sie im schlimmsten Fall eine separate VAO pro Objekt und Shader .
Wenn Sie die Shader dazu zwingen, Ihre eigene Attributnummerierungskonvention zu verwenden, glBindAttribLocation
kann dieses Problem leicht gelöst werden. Sie müssen lediglich eine konsistente Beziehung zwischen Attributen und ihren etablierten IDs beibehalten und die Shader zwingen, diese Konvention beim Verknüpfen zu verwenden.
(Das ist kein großes Problem, wenn Sie keine separaten VAOs verwenden, aber Ihren Code möglicherweise klarer machen.)
Übrigens:
Beim Einrichten von Attributpositionen für ein OpenGL-Shader-Programm stehen Ihnen zwei Optionen zur Verfügung
In OpenGL / GLSL 3.3 gibt es eine dritte Option: Geben Sie den Speicherort direkt im Shader-Code an . Es sieht aus wie das:
layout(location=0) in vec4 position;
Dies ist jedoch in der GLSL ES-Shader-Sprache nicht vorhanden.
glBindAttribLocation
meine Grafik-Engine zu verwenden, die unter Linux gut funktioniert hat. Als ich auf Windows portierte, verwendete es meine Normalen als Eckpunkte - ich musste ihm explizit die Reihenfolge der Variablen in meinem Shader mitteilenglBindAttribLocation
, damit es funktioniert ...