Wie wir alle irgendwann wissen, ist die Spezifikation eine Sache und die Implementierung eine andere. Die meisten Bugs verursachen wir selbst, aber manchmal ist das nicht der Fall.
Ich glaube, es wäre nützlich, eine kleine Liste von:
zu machenBitte denken Sie daran, immer die relevante Grafikkarte und Treiberversion zu veröffentlichen.
Lass mich anfangen:
Wenn Sie in Ihrem Vertex-Shader eine attribute
( in
) Variable haben, deren Name lexikalisch nach gl_
steht, dann können Sie keine eingebauten Attribute verwenden, nämlich gl_VertexID
und gl_InstanceID
. Wenn Sie es versuchen, wird der Shader nicht funktionieren (leerer Bildschirm, wahrscheinlich).
Nur verfügbar mit GLSL 3.3 und höher oder mit der Erweiterung GL_ARB_explicit_attrib_location
> Definieren Sie die Position eines beliebigen Attributs explizit als 0, indem Sie layout(location=0)
an seine Deklaration im Vertex-Shader anhängen. Sie können, müssen dies aber nicht für andere Attribute verwenden; Wichtig ist, dass ANY-Attribute die Position 0 haben müssen. Nachdem Sie das getan haben, ist die Benennung nicht mehr wichtig.
Verwenden Sie eine Namenskonvention, bei der Sie Ihre Attributvariablen mit a_
benennen müssen, was die Lesbarkeit des Codes nicht beeinträchtigt und alle Wörter vor gl_
(sichere Zone) lexikalisch erscheinen lassen.
Ein weiterer gl_VertexID Bug:
Dies tritt bei Macbooks auf. Es ist möglich, dass der neue Treiber, der OpenGL 3.2 mit OS X Lion unterstützt, das Problem behoben hat, aber viele Frameworks sind nur für die Verwendung der älteren 2.1-Treiber konfiguriert, so dass dies immer noch relevant ist.
Wenn Sie gl_VertexID lesen, bevor Sie ein anderes Attribut in einem Vertex-Shader lesen, gibt das letztere Attribut Junk-Daten zurück. Wenn das andere Attribut gl_Color ist, egal wie es verwendet wird, wird nichts gerendert. Der Zugriff auf andere integrierte Attribute kann zu einem anderen seltsamen Verhalten führen.
Wenn Sie gl_VertexID verwenden müssen, lesen Sie alle anderen Attribute, die Sie zuerst benötigen. Wenn Sie zuerst ein anderes Attribut lesen, gefolgt von gl_VertexID, funktionieren alle nachfolgenden Lesevorgänge des Attributs einwandfrei.