2012-04-30 19 views
26

Due domande veramente ...Differenze tra GLSL e GLSL ES 2

  1. È GLSL ES 2 una lingua totalmente separata, o una versione speciale di GLSL?
  2. Quali sono le differenze tra loro, in termini di funzioni di "libreria standard", sintassi e funzionalità?

Sto scrivendo shader per un'applicazione destinata a Windows, Mac e iPad e preferirei non dover aggiungere più versioni di ogni shader - shader ben più semplici comunque.

+5

Oltre alla risposta di Nicol, ho trovato utile consultare le schede di riferimento rapido per le varie versioni dell'API per verificare se esiste una funzione o funzionalità particolare. La versione OpenGL ES 2.0 si trova qui, ad esempio: http://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf –

risposta

26

GLSL ES 2 è una lingua completamente separata o una versione speciale di GLSL?

Ogni versione di GLSL è in definitiva un "linguaggio completamente separato"; alcuni non sono nemmeno retrocompatibili con le versioni precedenti. Tuttavia, la variazione ES di GLSL è ancora più difficile.

Pensatelo come una forcella di desktop GLSL. Un fork di GLSL da sei versioni fa, attenzione.

Quali sono le differenze tra di loro, in termini di funzioni di "libreria standard", sintassi e funzionalità?

Tra quali versioni?

L'unico motivo possibile per cui è necessario provare a condividere gli shader tra queste piattaforme è se si sta tentando di condividere il codice OpenGL tra di loro. Quindi dovresti limitarti alla funzionalità desktop OpenGL 2.1.

Ciò significa che dovresti utilizzare la versione GLSL desktop 1.20. Questo è simile a GLSL ES versione 1.00 (la versione di GLSL non ha lo stesso numero della versione GL corrispondente.) Bene, fino a desktop GL 3.3/4.0 e GLSL 3.30/4.00), ma comunque diversa. In ES, hai un sacco di qualificatori di precisione che il desktop GLSL 1.20 non gestisce.

Il modo migliore per gestirlo è utilizzare una stringa di shader "preamble". Vedi, glShaderSource prende più stringhe shader, che schiaffa insieme e si compila come una sola. È possibile prendere la stringa principale dello shader (main e il suo codice vario, attribute definizioni, uniforms, ecc.) E inserire una stringa di shader "preamble" davanti a quella. Il preambolo sarebbe diverso a seconda di cosa stai compilando.

tuo ES GLSL 1.00 preambolo sarebbe simile a questa:

#version 100 //Must start with a version specifier. 

tuo GLSL Desktop 1.20 preambolo sarebbe simile a questa:

#version 120 
#define lowp 
#define mediump 
#define highp 

E magari qualche altro giudiziosa #defines. In questo modo, lo shader può avere impostato questi qualificatori di precisione e saranno semplicemente #define d quando utilizzi il GLSL desktop.

Questo è un po 'come la codifica platform-neutral in C/C++, dove spesso si ha un'intestazione specifica per piattaforma che modifica la definizione e/o ha #define s su cui è possibile condizionare il codice in base a.

+2

"Shader che non includono # la direttiva versione sarà trattata come versione di destinazione 1.10. Gli shader che specificano #version 100 saranno da considerare come versione di targeting 1,00 del linguaggio OpenGL ES Shading, che è un sottoinsieme rigoroso della versione 1.50. " Dalla compatibilità ES2 –