/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Listas de dibujado en OpenGl

 
      Índice del Foro elrincondelc.com -> Gráficos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
kingfoslide54



Registrado: 25 Dic 2006
Mensajes: 75

MensajePublicado: 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 Laughing ) 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 Wink )[/code]
Volver arriba
Killrazor



Registrado: 24 Ene 2006
Mensajes: 1182
Ubicación: Barcelona

MensajePublicado: 08/08/2007 3:47 pm
Título:

Funciona asi:
imagina que tienes una moto cuya funcion de dibujado es dibujaMoto() (imaginacion al poder!!!! Smile Smile )

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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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é Wink
Volver arriba
kingfoslide54



Registrado: 25 Dic 2006
Mensajes: 75

MensajePublicado: 10/08/2007 6:10 am
Título:

Anda! ahora que me fijo es lo mismo que ya estaba haciendo Embarassed

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

MensajePublicado: 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

MensajePublicado: 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 Wink
Volver arriba
Killrazor



Registrado: 24 Ene 2006
Mensajes: 1182
Ubicación: Barcelona

MensajePublicado: 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

MensajePublicado: 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 Wink
Volver arriba
      Índice del Foro elrincondelc.com -> Gráficos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com