2012-05-06 5 views
10

Voglio solo memorizzare una serie di pesi che ha bisogno di ogni calcolo del frammento.Come definire un array costante in GLSL (OpenGL ES 2.0)?

questo:

float weights[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); 

getta solo questo:

ERROR: 0:30: ']' : syntax error syntax error 
ERROR: 0:30: ';' : syntax error syntax error 

risposta

17

Dal OpenGL ES SL 1.0 spec, comma 4.1.9 Arrays (p. 24):

Non v'è alcun meccanismo per inizializzare gli array a tempo di dichiarazione da dentro uno shader.

Si noti che questo è stato lasciato intenzionalmente. Secondo this post, la versione OpenGL ES SL per OpenGL ES 2 è basata su OpenGL SL 1.2. Lo stesso paragrafo (. P 20) contiene:

array possono avere inizializzatori formata da costruttori di array:

 float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); 
     float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1); // same thing 
+0

Sì, ma sembra che possa farlo per array cost, provatelo! –

+0

@Stefan Quindi è possibile inizializzare un array const in gl es sl 1.0? –

+0

@Viktor Sehr Ho citato le specifiche. Non utilizzare funzionalità supportate da un'implementazione, ma che non sono strettamente coperte. Il codice potrebbe non funzionare. Vedi anche il commento di Reto Koradi sull'altra risposta qui. –

1
precision highp float; 

const float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); 

Sta lavorando con KitKat versione Android (OpenGL ES 2.0).

+4

Quale GPU è nel tuo dispositivo? Sembra un bug del compilatore shader per consentirlo, poiché la specifica ES 2.0 dice chiaramente: "Non esiste alcun meccanismo per inizializzare gli array al momento della dichiarazione da uno shader". Alcuni compilatori sono abbastanza liberisti riguardo alle funzionalità ES 3.0 negli shader ES 2.0 senza riportare errori. Il problema è che lo stesso codice fallirà su dispositivi con GPU di diversi fornitori. –