2011-09-24 18 views
14

He estado buscando ejemplos de sombreadores en OpenGL y he visto algunos estilos diferentes. Algunos sombreadores utilizan específicamente los tipos incorporados (es decir, gl_Vertex) para transferir datos hacia y desde el código de la aplicación y el sombreador.Mejores prácticas de OpenGL ES 2.0 Shader

Algunos sombreadores utilizan los distintos tipos para transferir datos de vértice a sombreador de fragmentos en lugar de gl_Position y gl_FragColor.

Algunos shaders utilizan los prefijos 'en' y 'fuera' para especificar la transferencia de datos:

in vec3 vertex; 

void main() { 
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0); 
} 

... mientras que otros utilizan atributos:

attribute vec4 vertex_attrib; 
attribute vec4 tex_coord_attrib; 
attribute vec4 color_attrib; 
uniform mat4 mvp_matrix; 
uniform mat4 texture_matrix; 
varying vec4 frag_color; 
varying vec2 tex_coord; 

void main(void) 
{ 
    gl_Position = mvp_matrix * vertex_attrib; 
    vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib; 
    tex_coord = transformed_tex_coord.st/transformed_tex_coord.q; 
    frag_color = color_attrib; 
} 

Mi pregunta es, ¿cuál es la forma preferida en GLES 2.0 para escribir sombreadores? ¿Hay alguna guía de mejores prácticas? ¿Alguien puede proporcionar un ejemplo de un vértice & sombreador de fragmentos que es un ejemplo brillante de 'qué hacer'?

Gracias.

Respuesta

21
  1. No hay gl_Vertex en "ES 2.0". Todos los atributos proporcionados por usted son personalizados.
  2. gl_Position no es una opción en ES 2, pero es un requisito. Conozca más sobre OpenGL Pipeline para comprender por qué. Sugerencia: podría ser opcional solo cuando el rasterizador esté desactivado (Transform Feedback, por ejemplo) pero esto no es compatible con ES.
  3. En ES 2.0 los atributos de los vértices tienen que tener un valor 'de atributo' y las variaciones deben declararse como 'variables'. Usar 'in' y 'out' es un hábito desarrollado bajo OpenGL 3+ y no se puede aplicar a ES.

Por último, la mejor opción para usted sería leer OpenGL ES 2.0 Specification según lo sugerido por Nicol Bolas. Reglas primero, mejores prácticas, más adelante. ¡Buena suerte!

+0

'in' y' out' se puede aplicar con un poco de ayuda de las macros. – user1095108

22

Su mayor problema es que está mirando sombreadores GLSL de escritorio y tratando de entender lo que eso significa para GLSL-ES.

Así como OpenGL ES no es lo mismo que OpenGL, GLSL-ES no es lo mismo que GLSL. GLSL ha progresado relativamente lejos en los años transcurridos desde que GLSL-ES se separó. Por lo tanto, usted no puede utilizar sombreadores de escritorio GLSL como algo más que una guía aproximada para implementar sombreadores GLSL-ES. Más de lo que podría usar textos en C++ como guía para C.

Los idiomas son bastante similares, pero el escritorio GLSL tuvo que abandonar una gran cantidad de palabras clave que GLSL-ES aún no abandonó. Del mismo modo, GLSL de la vieja escuela (1.20) implementó muchas cosas que GLSL-ES y versiones posteriores de GLSL eliminaron, como entradas y salidas integradas. Por lo tanto, verá un lote de sombreadores GLSL de escritorio que no funcionarán en GLSL-ES. De hecho, si encuentras algunos que lo hacen, solo será por puro accidente.

No sé mucho sobre las guías para GLSL-ES, pero la más fácil de encontrar y usar es la última fuente: The OpenGL ES Shading Language Specification (PDF). Las extensiones pueden acumularse en la funcionalidad, pero ese PDF define el lenguaje central. Su próxima apuesta sería cualquier material explícitamente marcado como específico de OpenGL ES 2.0.

Básicamente, si bien puede comprender lo que hace un sombreador GLSL de escritorio, es mejor mirar el algoritmo y no la sintaxis si está escribiendo una aplicación OpenGL ES 2.0.

+2

no estoy en la etapa en que estoy mirando algoritmos. Solo trato de entender la sintaxis general de un sombreador GLSL_ES. Un ejemplo, si alguien tiene uno, sería ideal, ya que es más fácil de aprender de forma práctica que a través de páginas en un PDF. ¿Alguien tiene uno? – MarkP

+3

Normalmente me gustan los ejemplos más que especificaciones completas también, pero leyendo throu gh ese PDF particular fue muy esclarecedor para mí, y definitivamente lo recomiendo también. –

2

Hay código de ejemplo para OpenGL ES 2.0 en los tutoriales de Android Developer OpenGL ES 2.0 y también en el código de muestra de sdk. Pero aún necesitará el mismo archivo de referencia que las personas siguen mencionando: la Especificación del lenguaje de sombreado de OpenGL ES "para comprender ese código de muestra, ya que Google no suele explicar lo que están haciendo. Y cuando lo hacen, no siempre se ajustan a la terminología estándar OpenGL.

dicho esto, puede que le resulte más fácil para referirse a las páginas de referencia de OpenGL eS 2.0 en http://www.khronos.org/opengles/sdk/docs/man/ mientras que la lectura del código.