2010-10-25 19 views
7

Estoy un poco confundido acerca de este punto.OpenGL ES 2.0 múltiples mallas? (solo ejemplos del mundo real)

Todo lo que encontré en libros, blogs, foros e incluso en las especificaciones de OpenGl solo habla de técnicas muy abstractas. Nada sobre ejemplos del mundo real.

Y me estoy volviendo loco con esto: ¿Cómo poner y administrar múltiples objetos (mallas) con OpenGL ES 2.x?

En teoría parece simple. Tienes un Vertex Shader (vsh) y un Fragment Shader (fsh), luego unes los dos a un Programa (glGenProgram, glUseProgram, ...). En cada ciclo de renderizado, ese Programa realizará su VSH por cada Vertex y luego realizará FSH en cada "píxel" de ese objeto 3d y finalmente enviará el resultado final al búfer (obviamente sin hablar del por-vértice, rasterización y otros pasos en la tubería).

bien, parece sencilla ...

Todo esto es despedido por una llamada a la función draw (glDrawArrays o glDrawElements).

Aceptar nuevamente.

Ahora me confunden las cosas. Y si tiene varios objetos para representar?

Hablemos de un ejemplo del mundo real. Imagina que tienes un paisaje con árboles y un personaje. La hierba del paisaje tiene una textura, los árboles tienen textura para el tronco y las hojas (Texture Atlas) y finalmente el personaje tiene otra textura (Texture Atlas) y está animado también.

Después de imaginar esta escena, mi pregunta es simple: ¿Cómo se organiza esto?

Crea un programa separado (con un VSH y FSH) para cada elemento de la escena? Como un programa para el alivio de la hierba y el suelo, un programa para los árboles y un programa para el personaje?

Lo he intentado, pero ... cuando creo varios programas y trato de usar glVertexAttribPointer() las texturas y los colores de los objetos entran en conflicto entre sí. Debido a que la ubicación de los atributos, los índices, del primer Programa se repite en el segundo Programa.

Déjenme explicar, utilicé glGetAttribLocation() en una clase que controla el piso de la escena, por lo que el núcleo OpenGL me devolvió el índice de 0,1 y 2 para los atributos de los vértices. Después, en la clase de árboles creé otro programa, otros sombreadores, y después utilicé nuevamente el glGetAttribLocation() en este momento el retorno del núcleo OpenGL con índices de 0, 1, 2 y 3.

Después en el render ciclo, comencé a configurar el primer programa con glUseProgram() y he hecho cambios a sus atributos de vértices con glVertexAttribPointer() y finalmente una llamada a glDrawElements(). Después de esto, vuelva a llamar glUseProgram() al segundo Programa y use glVertexAttribPointer() nuevamente y finalmente glDrawElements(). Pero en este punto, las cosas entran en conflicto, porque los índices de atributos de vértices del segundo Programa también afectan a los vértices del primer Programa.

Probé muchas cosas, busqué mucho, pregunté mucho ... Estoy agotado. No puedo encontrar lo que está mal.

¡Así que comencé a pensar que estoy haciendo todo mal!

Ahora repito mi pregunta de nuevo: ¿Cómo trabajar con múltiples mallas (con diferentes texturas y comportamiento) en OpenGL ES 2.x? ¿Usando múltiples programas? ¿Cómo?

Respuesta

0

Gracias por la respuesta,

pero creo que sólo tiene que repetir mis propias palabras ... sobre los métodos de dibujo, alrededor de un programa activo, sobre todo.

Lo que sea.

¡El punto es que tus palabras me dan una idea! Usted dijo: "debe restablecer todos los atributos y punteros de los vértices".

Bueno ... no se ha reseteado exactamente, pero lo que no estaba actualizando TODOS los atributos de los vértices en el ciclo de renderizado, como las coordenadas de la textura. Estaba actualizando solo los atributos que cambian. Y cuando borré los buffers, perdí los valores anteriores.

Ahora empiezo a actualizar TODOS los atributos, independientemente del cambio o no de sus valores, ¡todo funciona!

Sede, lo que tenía antes es:

glCreateProgram(); 
... 
glAttachShader(); 
glAttachShader(); 
... 
glLinkProgram(); 
glUseProgram(); 
... 
glGetAttribLocation(); 
glVertexAttribPointer(); 
glEnableVertexAttribArray(); 
... 
glDrawElements(); 

que repiten el proceso para el segundo programa, pero sólo llamo glVertexAttribPointer() un par de veces.

Ahora, lo que tengo es una llamada a glVertexAttribPointer() para TODOS los atributos.

Lo que me volvió loco es el hecho de que si eliminé el primer bloque de código del primer programa, todo el segundo programa funcionó bien. Si eliminé el segundo bloque de código para el segundo programa, el primero funcionó bien.

Ahora parece tan obvio. Por supuesto, si el VSH es una operación por vértice, funcionará con valor anulado si no actualizo TODOS los atributos y uniformes. Pensé en OpenGL más como un motor 3D, que funciona con objetos en 3D, tiene una escena en la que colocas tus objetos, enciendes luces. Pero no ... OpenGL solo conoce triángulos, líneas y puntos, nada más. Yo pienso diferente ahora

De todos modos, el punto es que ahora puedo seguir adelante!

Gracias

+0

¿Podría mejorar amablemente su respuesta? Estoy muy feliz de que hayas entendido: D – MatterGoal

2

Para dibujar varias mallas, simplemente llame a glDrawElements/glDrawArrays varias veces. Si esas mallas requieren sombreadores diferentes, simplemente configúrelos. ONE, y solo UN programa de sombreado está activo.

Así que cada vez que cambie su programa de sombreado (específicamente el VS), debe restablecer todos los atributos y punteros de los vértices.

Simplemente así de fácil.

Cuestiones relacionadas