GLSL Indizierung in uniform Array mit variabler Länge

8

Ich übergebe ein uniformes Array an den Geometrieshader und möchte mit einer Variablen indizieren. Ich kann variable Länge Array & amp; Index mit fester Nummer (numerische Konstante) ODER Ich kann eine feste Länge Array & amp; Index mit Variablen. Allerdings kann ich nicht in Variablen Array mit einer Variablen indizieren.

Unten ist Pseudocode für Geometrieshader mit Fällen, in denen & amp; Fall, der nicht funktioniert

Das funktioniert:

%Vor%

Das funktioniert:

%Vor%

Das funktioniert nicht:

%Vor%

Ist es möglich, so etwas zu tun?

    
Jitu 08.11.2013, 21:26
quelle

1 Antwort

12

Leider ist das nicht möglich. Sie haben die GLSL-Version, auf die Sie ausgerichtet sind, nicht eingefügt, aber Geometrieshader erwähnt. Daher habe ich den relevanten Teil der GLSL 1.5-Spezifikation hinzugefügt. unten:

GLSL-Spezifikation (Version 1.5) - 4.1.9 Arrays - S. 25.

  

Variablen desselben Typs können zu Arrays zusammengefasst werden, indem ein Name gefolgt von Klammern ([]) deklariert wird, die eine optionale Größe einschließen. Wenn eine Array-Größe in einer Deklaration angegeben wird, muss es ein ganzzahliger konstanter Ausdruck (siehe Abschnitt 4.3.3 "Konstante Ausdrücke") sein, der größer als Null ist. Wenn ein Array mit einem Ausdruck indiziert wird, der kein ganzzahliger konstanter Ausdruck ist, oder wenn ein Array als Argument an eine Funktion übergeben wird, muss seine Größe vor einer solchen Verwendung deklariert werden.

Während Desktop-GLS viel verzeihender ist, wenn es darum geht, Arrays mit nichtkonstanten Ausdrücken als GLSL ES zu indexieren, müssen Sie immer noch innerhalb gewisser Grenzen arbeiten. Genauso wie Textur-Lookups häufig dazu verwendet werden, die nicht-kon- stante Array-Indizierung in OpenGL ES zu überwinden, können Sie dies möglicherweise umgehen, indem Sie eine 1D-Textur-Suche in Ihrem Geometrieshader verwenden. Ich muss mich fragen, ob Sie diese Funktionalität tatsächlich so schlecht brauchen?

Es ist eine gute Idee, auf jeden Fall eine obere Grenze für Ihr einheitliches Array zu definieren, da die GLSL-Spezifikation. erfordert nur eine Implementierung 1024 einheitliche Komponenten (z. B. 1024 float , 256 vec4 , 64 mat4 oder eine Kombination davon) in der Geometrieshader-Stufe bereitzustellen. Wenn Ihr Array zum Zeitpunkt der Kompilierung eine bekannte maximale Größe hat, können Sie Probleme vermeiden, die mit dem unwissentlichen Überschreiten dieser Einschränkung verbunden sind.

UPDATE:

Da Sie GLSL 4.x erwähnt haben, möchte ich auf ein neueres Feature in OpenGL hinweisen, bekannt als Shader Storage Buffer Objects . Wenn Sie SSBOs verwenden, können Sie möglicherweise ein Array mit dynamischer Länge zur Laufzeit für Ihre Zwecke verwenden. Sie können die Länge eines SSBO mit .length () im Shader abfragen und die Bereichsvalidierung selbst durchführen. Ich denke jedoch, dass dies wahrscheinlich zu viel ist, aber erwähnenswert ist.

    
Andon M. Coleman 08.11.2013, 21:43
quelle

Tags und Links