2012-07-11 4 views
5

Desidero avere la stessa sorgente di shader per OpenGL ES e OpenGL (Windows). Per fare questo voglio definire i tipi di dati personalizzati e utilizzare solo le funzioni OpenGL ES.Shader compatibili OpenGL ES e OpenGL

Un approccio è quello di definire:

#define highp 
#define mediump 
#define lowp 

per Windows shader e scrivere lo shader come lo è per OpenGL ES.

altro approccio è quello di definire i tipi di dati personalizzati come questo per OpenGL ES:

#define hvec2 highp vec2 

e come questo per Windows

#define hvec2 vec2 

Cosa pensi sia meglio? Avete altre soluzioni per questo problema?

risposta

4

La mia soluzione è stata quella di scrivere codice shader è compatibile sia con le API, e poi durante il caricamento il frammento di codice sorgente di shader per OpenGL ES basta anteporre la seguente riga:

precision mediump float; 

che imposta il valore predefinito precisione in virgola mobile a media. Negli shader di frammenti OpenGL ES non esiste un livello di precisione predefinito per i valori in virgola mobile, il che significa che è necessario specificare una precisione su ogni dichiarazione in virgola mobile o impostare in modo esplicito una precisione predefinita. Potresti usare lowp o highp se questo ha più senso per la tua applicazione.

Per maggiori dettagli si veda la sezione 4.5.3 della specifica OpenGL ES Shading Language: http://www.khronos.org/files/opengles_shading_language.pdf

Si potrebbe anche mescolare questo approccio con il vostro approccio #define se avete bisogno di un controllo più preciso su di precisione nei vostri shader.

4

Si potrebbe utilizzare http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

Questa estensione aggiunge il supporto per le funzionalità di OpenGL ES 2.0 che mancano da OpenGL 3.x. L'attivazione di queste funzionalità faciliterà il processo di porting delle applicazioni da OpenGL ES 2.0 a OpenGL.

+0

Qualcuno sa come funziona? Ho sfogliato le specifiche ma non sono riuscito a trovare nulla relativo a come un GLSL ES (versione 100) e GLSL (versione 150) sarebbero stati affatto compatibili. –

+0

Per riferimento futuro ho scoperto che in ES2_compatibility un contesto OpenGL 3.2> può caricare shader ES 2.0 con #versione 100 in alto. –

1

ho fatta semplicemente definendo quanto segue al inizio di ogni Shader quando lo shader viene eseguito su Windows:

#define lowp 
#define mediump 
#define highp 

Ulteriori dò lo shader l'informazione che viene utilizzata Plattform (WINDOWS, MOBILE, IOS) che può essere utilizzato in questo modo:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

Upvote temprato per la parte superiore del commento - Penso che sia molto più prezioso avere i modificatori di precisione e scartarli su piattaforme irrilevanti piuttosto che non includerli ed essere a detrimento delle prestazioni altrove. Ma '#ifdef GL_ES' (e' # ifndef') è il modo più semplice per compilare in modo condizionale, essendo integrato. – Tommy