OpenGL ES 2.0 múltiples programas o múltiples Shaders o qué? ¿Como funciona?

El problema (TL, DR)

Mi problema, fundamentalmente, es que no sé cómo OpenGL ES 2.0 espera que escriba y use varios shaders; O si es incluso aconsejable / esperado que una persona lo haga.

La pregunta fundamental aquí es: si tengo una manzana, una roca brillante y una malla borrosa, todas en el mismo mundo en 3D, todas mejor dibujadas con diferentes programas de sombreado, pero usando la misma mvpMatrix, entonces, ¿cómo iría usando todos ellos en El mismo OpenGL hacer que todos ellos utilizan sus shaders más adecuado que he escrito?

Qué he hecho

Así que he escrito un programa básico de OpenGL ES 2.0 para mi juego Android que funciona perfectamente en que se puede dibujar el contorno de los objetos a la pantalla. Pero no hace nada más; Prácticamente porque los shaders se parecen a esto:

Sombreado de vértice

uniform mat4 uMVPMatrix; attribute vec4 aPosition; void main() { gl_Position = uMVPMatrix * aPosition; } 

Shader de fragmentos

 void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } 

Ahora son bastante básicos. La razón por la que no he ido más lejos es porque no puedo averiguar si se supone que debo escribir un sombreado para aplicar a todos mis diferentes objetos o si se supone que debo usar múltiples shaders. Y si se supone que debo usar varios shaders para dibujar varios objetos diferentes, ¿cómo puedo hacer eso de una manera eficiente?

Tengo la sensación de que este debe ser un conocimiento básico para cualquiera que hace OpenGL ES 2.0 día tras día, así que espero que alguien pueda responder a mi pregunta o señalarme en la dirección correcta.

Yo tengo:

  • Miró múltiples tutoriales; Ninguno de los cuales utilizan nada más que los shaders más básicos.
  • Lea toda la especificación GLSL de OpenGL ES 2.0 (ninguna de las cuales mencionó cómo estaba destinada a ser utilizada, sino que se trataba de lo que todo hacía en lugar de cómo encaja).
  • Traté de modificar mis shaders un poco.

Así que espero que esté cerca de entender el flujo de trabajo de OpenGL pero no parezco estar allí todavía.

Edit: Encontré esto bien después:

Si su aplicación está escrita para OpenGL ES 2.0, no cree un solo shader con muchos conmutadores y condicionales que realice cada tarea que su aplicación necesite para representar la escena. En su lugar, compile varios programas de sombreado que cada uno realice una tarea específica y enfocada.

Eso es de las guías de iOS OpenGL ES 2.0.

Puede usar varios shaders, pero cambiar entre ellos puede ser bastante costoso, así que la práctica recomendada es dibujar todos los objetos de un shader, luego cambiar al siguiente shader y dibujar todos los objetos usando ese y así sucesivamente.
Para cambiar entre sombreadores, llama a glUseProgram() .

  • Proporciona una vista previa de la cámara en una textura con destino GL_TEXTURE_2D
  • Android: TextView dañado usando .setShader ()
  • ¿Por qué mi programa de shader openGL para puntos tiene anillos de artefactos?
  • Pasar atributos personalizados a un shader de fragmentos personalizado
  • Vertex Buffer Objects (VBO) no funciona en Android 2.3.3, con GLES20
  • Android glShaderBinary
  • Cómo crear una textura OpenGL de matriz de bytes en Android
  • GlCreateShader y glCreateProgram fallan en android
  • Pasar datos adicionales para fragmentar el shader a través de VBO - DynamicSpriteBatch
  • Cómo utilizar la cámara con Android OpenGL ES para trabajar?
  • Intercambiar píxeles de MainTex con otras texturas a través de la superficie Shader (Unity)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.