OpenGL ES (2.0) Shading Language: Wie boolean in den Vertex-Shader eingegeben und an den Fragment-Shader übergeben werden?

8

Ich versuche zum ersten Mal einen booleschen Wert in meinen Vertex-Shader zu übergeben; Ich habe bis jetzt nur Floats benutzt.

Der fragliche Boolean ist primitiv-spezifisch und kann daher nicht als Uniform übergeben werden. Es hat jedoch den gleichen Wert für alle Ecken eines gegebenen Primitivs.

Aus der Khronos-Spezifikation geht hervor, dass "variating" die einzige Möglichkeit ist, Daten an den Fragment-Shader weiterzuleiten, aber es ist nicht überraschend, dass "variating bool my_bool;" verursacht einen Parserfehler, wenn er in meinem Vertex-Shader definiert ist.

Ich übergebe den booleschen Wert in meinen Vertex-Shader als:

%Vor%

Ich definiere ein variierendes in einem Versuch, an den Fragment-Shader zu übergeben:

%Vor%

Könnte mir bitte jemand sagen, wie ich erreichen kann, was ich vorhabe?

    
KomodoDave 14.01.2012, 15:34
quelle

2 Antworten

12

Aus §4.3.5 von Die OpenGL® ES Shading Language Version 1.0.17 (PDF) :

  

Das variierende Qualifikationsmerkmal kann nur mit den Datentypen float, vec2, vec3, vec4, mat2, mat3 und mat4 oder Arrays davon verwendet werden.

Und aus §4.3.3:

  

Das Attributqualifikationsmerkmal kann nur mit den Datentypen float, vec2,   vec3, vec4, mat2, mat3 und mat4. Attributvariablen können nicht als deklariert werden   Arrays oder Strukturen.

Sie können also kein attribute bool haben, geschweige denn ein varying bool , je nach Spezifikation.

Wenn Sie wirklich einen booleschen Wert pro Knoten benötigen, können Sie 0.0 für false und 1.0 für true verwenden. Prüfen Sie beim Testen auf x > 0.5 . zB:

%Vor%

Solange alle Ecken in jedem Dreieck den gleichen Wert haben, sollte dies funktionieren. Wenn sie nicht konsistent sind, haben Sie verschiedene Fragmente für dasselbe Dreieck, die sich unterschiedlich verhalten. (Wenn Sie bei 0.0 und 1.0 bleiben, verhält sich das Viertel des Dreiecks, das der "ungeraden" Ecke am nächsten liegt, anders als der Rest.)

    
Laurence Gonsalves 21.03.2012, 18:59
quelle
3

Ich rate Ihnen dringend, das Attribut nicht zu verwenden und zu Uniformen zu wechseln, obwohl der Boolean an ein bestimmtes Primitiv gebunden ist. Mit Uniform kannst du es einmal einstellen und mehrmals verwenden, mit Attribut erhöhst du die Speicherbandbreite, die für jede Zeichnung benötigt wird. Der einzige Sinn, den ich darin sehe, ist, wenn Sie eine extreme Dosierung Ihrer Primitiven durchführen, aber selbst in diesem Fall müssen die wirklichen Vorteile dieser Lösung sorgfältig bewertet werden, da das Risiko darin besteht, den gegenteiligen Effekt zu erzielen.

Bei variierenden Variablen besteht ein häufiger Fehler darin, das Variieren sowohl in Vertex- als auch in Fragment-Shadern nicht zu deklarieren und eine der 2 zu verpassen.

Dies würde zu einem Verknüpfungsfehler führen, und Sie würden es trotzdem bemerken, wenn Sie die Kompilier- und Verknüpfungsergebnisse überprüfen.

Ein weiterer Aspekt, den ich an Ihrer Stelle überprüfen würde, ist sicherzustellen, dass die Variablen in Ihrem Code zugewiesen und verwendet werden, da der Compiler unbenutzte Inhalte entfernt (tote Code-Optimierung) und dies zu einem sehr häufigen Problem führt.

    
Maurizio Benedetti 14.01.2012 17:34
quelle