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?
- Cómo renderizar la imagen de la cámara YUV-NV21 de Android en el fondo en libgdx con OpenGLES 2.0 en tiempo real?
- El algoritmo de ruido falla en Samsung Galaxy SIII (GLES)
- LibGDX - Shader trabajando en el escritorio pero no en Android
- OpenGL se bloquea al vincular el programa, LG Nexus 4
- Creación de shaders OpenGL en NativeActivity
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.
- ¿Cómo acceder a otro vértice en un programa de sombreado de vértices en opengl es 2?
- ¿Se descarta mal el rendimiento del programa en OpenGL?
- Simulación de swaps de paletas con Shaders OpenGL (en LibGDX)
- Cómo pasar la matriz int en el fragmento de fragmento de Android OpenGl
- Utilizar glVertexAttribPointer y glDrawElements para extraer de un buffer de vértice empaquetado
- Cómo pasar los datos correctos a un programa de shader OpenGL-ES 2.0
- Aplicando textura a Cubo, textura diferente en cada cara de cubo
- Dónde almacenar código de sombreado en la aplicación para Android
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()
.
- Problemas de reproducción de Android Studio: No se encontraron las clases siguientes
- ¿Cómo puedo acceder al sonido de pitido predeterminado de Android?