2015-11-13 5 views
14

Ich versuche, eine boolean zu einem OpenGL GLSL Shader zu senden.OpenGL Bool Uniform?

Zur Zeit habe ich diese im Shader:

uniform bool foo; 

Und ich benutze diese es zu setzen:

glUniform1i(glGetUniformLocation(shader, "foo"), true); 

Es ist kein glUniform1b zu sein scheint, so dass ich es einstellen als ganze Zahl. Dies scheint gut zu funktionieren.

Gibt es irgendein Problem mit diesem Ansatz? Ist es tragbar oder könnte es bei anderen Grafikkarten/Treibern kaputt gehen? Ich bin mit OpenGL 4.3 im Moment.

+0

Soweit ich weiß, es hat etwas mit 4-Byte-alingment zu tun (boolean ist 1 Byte, so oder so 3 zusätzliches Füllbytes wird am Ende hinzugefügt werden) so boolean Verwendung ist nicht effizient und maby sogar schon gar nicht als veraltet in OpenGL veraltet – Amadeusz

+0

@Amadeusz es. –

Antwort

15

§ 4.1 Grundtypen Die OpenGL Shading Language die folgenden grundlegenden Datentypen unterstützt, wie folgt gruppiert:

  • bool eine bedingte Art, auf Werte von unter wahr oder falsch
  • bvec2 ein zweikomponentiger boolescher Vektor
  • bvec3 ein boolescher Dreikomponentenvektor
  • bvec4 eine Vier-Komponenten Boolean Vektor

...

§ 4.1.2 Boolesche Um bedingte Ausführung von Code einfacher auszudrücken, der Typ Bool wird machen unterstützt. Es gibt keine Erwartung, dass Hardware solche Variablen direkt unterstützt. (...)

Als zur Einstellung:

§ 2.2.1 (...) Bei der Zustandswerte spezifiziert sind, eine andere Art der Parameter als die tatsächliche Art dieses Zustandes verwendet wird, Datenumwandlungen werden wie folgt durchgeführt:

  • Wenn die Art der internen Zustand boolean, integer Null oder Fließkommawerte umgewandelt werden FALSE und nicht-Null-Werte umgewandelt werden TRUE.
+0

Danke. 4.1 bedeutet, dass ich in meinem Bool GLSL Shader verwenden kann. 4.1.2 hilft mir nicht wirklich. Was noch nicht beantwortet ist, ist, wenn ich mit glUniform1i eine boolesche Uniform einstellen kann ... –

+1

@ JanRüegg Auch dafür ein Zitat hinzugefügt –