2012-07-11 33 views
5

Quiero tener la misma fuente de sombreado para OpenGL ES y OpenGL (Windows). Para hacer esto, quiero definir tipos de datos personalizados y usar solo funciones de OpenGL ES.OpenGL ES y sombreadores compatibles con OpenGL

Un método consiste en definir:

#define highp 
#define mediump 
#define lowp 

para Windows shader y escribir el shader como lo es para OpenGL ES.

Otro enfoque es definir tipos de datos personalizados como este para OpenGL ES:

#define hvec2 highp vec2 

y como este para Windows

#define hvec2 vec2 

¿Qué le parece que es mejor? ¿Tienes otras soluciones para este problema?

Respuesta

4

Mi solución ha sido escribir código de sombreado que es compatible con las API y, a continuación, al cargar el código fuente fragment shader a OpenGL ES simplemente escriba la siguiente línea:

precision mediump float; 

que establece el valor predeterminado punto flotante de precisión a medio. En los sombreadores de fragmentos de OpenGL ES no existe un nivel de precisión predeterminado para los valores de coma flotante, lo que significa que debe especificar una precisión en cada declaración de punto flotante o establecer explícitamente una precisión predeterminada. Puede usar lowp o highp si tiene más sentido para su aplicación.

Para más detalles, véase la sección 4.5.3 de la especificación OpenGL ES lenguaje de sombreado: http://www.khronos.org/files/opengles_shading_language.pdf

También podría mezclar este enfoque con su enfoque #define si necesita un control más preciso sobre la precisión en sus shaders.

4

Usted podría utilizar http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

Esta extensión añade soporte para funciones de OpenGL ES 2.0 que faltan en OpenGL 3.x. La habilitación de estas características facilitará el proceso de portar aplicaciones desde OpenGL ES 2.0 a OpenGL.

+0

¿Alguien sabe cómo funciona esto? He revisado la especificación pero no he podido encontrar nada relacionado con la compatibilidad de GLSL ES (versión 100) y GLSL (versión 150). –

+0

Para referencia futura, descubrí que en ES2_compatibility, un contexto OpenGL 3.2> puede cargar sombreadores ES 2.0 con #version 100 en la parte superior. –

1

lo he conseguido con sólo definir lo siguiente en el inicio de cada shader cuando el shader se ejecuta en Windows:

#define lowp 
#define mediump 
#define highp 

adicional i dar el sombreado de la información, que se utiliza Plattform (WINDOWS, MOBILE, IOS) que se puede utilizar de esta manera:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

Votación templada para la parte superior del comentario: creo que es mucho más valioso tener los modificadores de precisión y descartarlos en plataformas irrelevantes que no incluirlos y estar en desventaja en el rendimiento en otros lugares. Pero '#ifdef GL_ES' (y' # ifndef') es la forma más fácil de compilar condicionalmente, ya que está integrado. – Tommy

Cuestiones relacionadas