2012-01-14 11 views
8

che sto cercando di passare un valore booleano nel mio vertex shader per la prima volta; Fino ad ora ho usato i float.OpenGL ES (2.0) Shading Language: come booleano input in vertex shader e passare al frammento di shader?

La booleano in questione è primitivo-specifica e quindi non può essere passato come una divisa. Tuttavia ha lo stesso valore per tutti i vertici di ogni data primitiva.

Sembra dalle specifiche di Khronos che "variando" è l'unico modo per passare i dati nello shader di frammenti, ma in modo inaspettatamente dichiarando "bool variabile my_bool;" causa un errore del parser quando è definito nel mio vertex shader.

sto passando il booleano nel mio vertex shader come:

attribute bool a_my_bool; 

definisco una variabile nel tentativo di passare allo shader frammento:

varying bool v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

Potrebbe per favore qualcuno mi dica come Posso ottenere quello che intendo?

risposta

12

Da §4.3.5 di The OpenGL® ES Shading Language version 1.0.17 (PDF):

Il qualificatore variabile può essere utilizzato solo con i tipi di dati galleggiante, vec2, vec3, vec4, mat2, Mat3 e Mat4, o matrici di questi.

E da §4.3.3:

Il qualificatore attributo può essere utilizzato solo con i tipi di dati float, vec2, vec3, vec4, mat2, Mat3 e Mat4. Le variabili di attributo non possono essere dichiarate come matrici o strutture .

così non si può avere un attribute bool, figuriamoci un varying bool, secondo le specifiche.

Se davvero bisogno di un valore booleano per vertice si potrebbe usare 0,0 per falso e 1.0 per vero. Durante il test, verificare x > 0.5.es .:

Fintanto che tutti i vertici di ogni triangolo hanno lo stesso valore, questo dovrebbe funzionare. Se non sono coerenti, finirai con frammenti diversi per lo stesso triangolo che si comporta diversamente. (Se ci si attacca a 0.0 e 1.0, il quarto del triangolo più vicino all'angolo "dispari" si comporterà diversamente dal resto.)

3

io consiglio vivamente di non utilizzare l'attributo e passa a uniformi anche se la booleana è attaccato ad un dato primitivo. Con Uniform lo imposti una volta e usi molte volte, con l'attributo aumenti molto la larghezza di banda di memoria richiesta in ogni estrazione. L'unico senso che vedo in questo è che se si esegue un dosaggio estrema dei vostri primitivi, ma, anche in quel caso, i reali benefici di questa soluzione devono essere valutati con cautela in quanto il rischio è quello di ottenere l'effetto opposto.

Informazioni sulle variabili diverse, un errore comune è quello di non dichiarare la variabile in entrambi i vertex shader e Frammento e perdere uno dei 2.

Questo solleverebbe un errore di collegamento e si nota comunque controllando la compilazione e il collegamento dei risultati.

Un altro aspetto che vorrei controllare al posto dell'utente è quello di assicurarsi che le variabili vengano assegnate e utilizzate nel codice in quanto il compilatore rimuove i contenuti non utilizzati (ottimizzazione del codice morto) e questo si traduce in un problema molto comune.