2012-04-30 39 views
26

dos preguntas realmente ...GLSL GLSL y ES 2

  1. Es GLSL ES 2 un lenguaje totalmente separada, o una versión especial de GLSL?
  2. ¿Cuáles son las diferencias entre ellos, en términos de funciones de "biblioteca estándar", sintaxis y capacidades?

Estoy escribiendo sombreadores para una aplicación dirigida a Windows, Mac y iPad y preferiría no tener que agregar más versiones de cada sombreador - sombreadores bien más simples de todos modos.

+5

Además de la respuesta de Nicol, he encontrado que es útil mirar las tarjetas de referencia rápida para varias versiones de API para ver si una función o capacidad en particular existe. El OpenGL ES 2.0 uno se encuentra aquí, por ejemplo: http://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf –

Respuesta

26

¿Es GLSL ES 2 un lenguaje totalmente independiente, o una versión especial de GLSL?

Cada versión de GLSL es, en última instancia, un "lenguaje totalmente independiente;" algunos ni siquiera son compatibles con versiones anteriores. Sin embargo, la variación ES de GLSL es aún más.

Piense en ello como un tenedor de escritorio GLSL. Un tenedor de GLSL desde seis versiones atrás, tened cuidado.

¿Cuáles son las diferencias entre ellos, en términos de funciones de "biblioteca estándar", sintaxis y capacidades?

¿Entre qué versiones?

La única razón posible por la que podría tener que tratar de compartir sombreadores entre estas plataformas es si está intentando compartir el código de OpenGL entre ellos. Por lo tanto, tendría que limitarse a la funcionalidad de OpenGL 2.1 de escritorio.

Eso significa que utilizará la versión 1.20 de escritorio GLSL. Esto es similar a la versión 1.00 de GLSL ES (a la versión de GLSL no se le asigna el mismo número que la versión GL correspondiente. Bueno, hasta el escritorio GL 3.3/4.0 y GLSL 3.30/4.00), pero sigue siendo diferente. En ES, tiene muchos calificadores de precisión que el escritorio GLSL 1.20 no maneja.

La mejor manera de manejar eso es usar una cadena de sombreado "preámbulo". Ver, glShaderSource toma múltiples cadenas de sombreado, que se junta y se compila como una sola. Puede tomar su cadena de sombreado principal (main y sus diversos códigos, attribute definiciones, uniforms, etc.) y pegar una cadena de sombreado "preámbulo" delante de eso. El preámbulo sería diferente dependiendo de para qué estás compilando.

Su ES GLSL 1.00 preámbulo se vería así:

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

su escritorio GLSL 1.20 preámbulo se vería así:

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

Y tal vez algunos otros juiciosa #defines. De esta forma, su sombreador puede tener esos calificadores de precisión establecidos, y solo estarán #define d cuando use el escritorio GLSL.

Esto es muy similar a la codificación de plataforma neutral en C/C++, donde a menudo tiene un encabezado específico de la plataforma que cambia la definición y/o tiene #define s que puede condicionar el código en función.

+2

"Shaders que no incluyen un # directiva de versión será tratada como orientación versión 1.10. Los sombreadores que especifiquen #version 100 se tratarán como como orientación versión 1.00 del lenguaje de sombreado de OpenGL ES, que es un subconjunto estricto de la versión 1.50. " De la compatibilidad con ES2 –