| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
kingfoslide54
Registrado: 25 Dic 2006 Mensajes: 75
| Publicado: 08/08/2007 6:45 am | | | Título: Listas de dibujado en OpenGl |
| Hola a todos. Sigo trabajando en el embrión de mi soñado simulador de carreras de motos. Hasta ahora he conseguido:
-Cargar modelos directx de texto y texturas en BMP, y subirlos a la gráfica. (la carga de dx es muuuuy lenta, y los BMP no admiten transparencias y pesan lo que todos sabéis)
-Recoger entrada de Joystick y teclado con SDL (esto es fácil).
-Implementar un timer básico con SDL.
-Mostrar objetos y moverlos por el escenario, moviendo también la cámara, usando cámaras en Opengl (funciona bien, con algún pequeño "pero").
Bien, antes de empezar a desarrollar las físicas (ya os daré el cognazo con las colisiones ) tengo que solucionar algunos problemillas. Uno de ellos es la rapidez y eficiencia de dibujado. Con unos 15.000 polis es escena, me cuesta mantener 30 fps. Para poder optimizar el rendimiento, necesito saber un poco cómo funciona la generación de listas en OpenGl con GLGenList. Por lo que he podido observar, esta función me permite meter en las listas cualquier instrucción, de lo que deduzco que muchas de ellas se "guardan" en ram, y no en la gráfica.
En la gráfica, si no me equivoco, se guarda el dibujado en sí. ¿También las transformaciones (Rotate, Translate, Multmatrix, etc)?¿Y los cambios de luz, material, etc? Si meto un if dentro del GLGenList, o un bucle. ¿Los ejecuta una sola vez al crear la lista, o bien cada vez que la llamo?
Otra duda que tengo, en la misma línea, es si hay alguna diferencia en cuanto a rendimiento entre hacer esto:
| Código: | void crealista(){ //Empiezo lista //Dibujado //cierro lista
|
y esto (que es lo que hago porque a nivel de código es más cómodo y versátil):
| Código: | void dibujamalla(argumentos){ //Dibujado } void crealista(){ //Empiezo lista dibujamalla(argumentos); //cierro lista }
|
Un saludo, y gracias por vuestra ayuda (en especial a Killrazor, que siempre está ahí cuando tengo una duda )[/code] |
|
| Volver arriba | |
 |
Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 08/08/2007 3:47 pm | | | Título: |
| Funciona asi: imagina que tienes una moto cuya funcion de dibujado es dibujaMoto() (imaginacion al poder!!!! )
Primero generas la lista:
| Código: | GLuint listaMoto;
// le pido a GL que me genere una lista listaMoto = glGenList(1);
// creo la lista. EL GL_COMPILE significa que no dibuje ahora sino que simplemente cree la lista glNewList(listaMoto,GL_COMPILE);
//y ya esta creada. Finalizar proceso glEndList();
|
Ahora tienes creada y cargada una display list identificada por listaMoto que es un identificador unico.
Ahora para dibujar:
| Código: |
render(){ glCallList(listaMoto); }
|
Facil, no? _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
|
| Volver arriba | |
 |
kingfoslide54
Registrado: 25 Dic 2006 Mensajes: 75
| Publicado: 09/08/2007 12:25 pm | | | Título: |
| Hacía algo parecido, pero com GlBeginList y GLEndList. No conocía GLNewList, con una llamada a la función de dibujado como argumento. Probaré y os cuento.
Muchas gracias! |
|
| Volver arriba | |
 |
|
Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 09/08/2007 2:17 pm | | | Título: |
| Cuidado!! No es la funcion de dibujado sino la funcion de dibujado de un objeto. Es decir, usa una display list para cada objeto (cada moto) _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
|
| Volver arriba | |
 |
kingfoslide54
Registrado: 25 Dic 2006 Mensajes: 75
| Publicado: 10/08/2007 5:49 am | | | Título: |
| | Killrazor escribió: | | Cuidado!! No es la funcion de dibujado sino la funcion de dibujado de un objeto. Es decir, usa una display list para cada objeto (cada moto) |
Sí, sí, lo había entendido. Uso una display list para cada parte de la moto con movimiento relativo.
En un rato probaré  |
|
| Volver arriba | |
 |
kingfoslide54
Registrado: 25 Dic 2006 Mensajes: 75
| Publicado: 10/08/2007 6:10 am | | | Título: |
| Anda! ahora que me fijo es lo mismo que ya estaba haciendo 
Mis dudas venías acerca de la optimización de las instrucciones que metes entre glBeginList y glEndList.
Un saludo. |
|
| Volver arriba | |
 |
|
Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 13/08/2007 7:50 am | | | Título: |
| Optimizacion? Que clase de dudas tienes. Creo que lo que tienes que hacer es dibujar dentro un objeto estatico y despues transformarlo desde fuera aunque eso es bastante evidente, no? _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
|
| Volver arriba | |
 |
kingfoslide54
Registrado: 25 Dic 2006 Mensajes: 75
| Publicado: 13/08/2007 7:05 pm | | | Título: |
| | Killrazor escribió: | | Optimizacion? Que clase de dudas tienes. Creo que lo que tienes que hacer es dibujar dentro un objeto estatico y despues transformarlo desde fuera aunque eso es bastante evidente, no? |
Sí, claro, eso es lo que hago... pero hay muchas formas de hacerlo. Para muestra un botón:
Antes, al llamar a la función de dibujado durante la creación de la lista, dicha función iba cambiando el material (en mi caso sólo la textura, porque no estoy tratando el resto de propiedades) según el triángulo que dibujaba. Luego, cambié la función para que dibujara de una vez todos los triángulos de cada malla que compartían textura, con la idea de "obligar a la gráfica a cambiar menos veces la textura a dibujar". Claro que sin conocer el funcionamiento interno de las listas es un poco ir a ciegas, pero el hecho es que mejoró en unos 10 fps en todas las circunstancias.
A eso me refiero, a crear las listas "bien". Como ese truco deben existir más, y esos son los que quiero conocer  |
|
| Volver arriba | |
 |
Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 14/08/2007 1:36 am | | | Título: |
| Las listas en ese caso no tienen que ver. Es decir, dibuja como si no las usases, de la manera mas rapida posible. Imaginemos que tienes la misma moto y tres texturas (la moto roja, la azul y la verde). Pues entonces haz una lista y antes de dibujar cada moto haces el bind de la textura para cambiarla. En principio es la manera mas rapida. _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
|
| Volver arriba | |
 |
|
kingfoslide54
Registrado: 25 Dic 2006 Mensajes: 75
| Publicado: 14/08/2007 3:07 am | | | Título: |
| | Killrazor escribió: | | Las listas en ese caso no tienen que ver. Es decir, dibuja como si no las usases, de la manera mas rapida posible. Imaginemos que tienes la misma moto y tres texturas (la moto roja, la azul y la verde). Pues entonces haz una lista y antes de dibujar cada moto haces el bind de la textura para cambiarla. En principio es la manera mas rapida. |
Ok, gracias  |
|
| Volver arriba | |
 |
|
|