Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Alguien ha probado si hay mucha diferencia en OpenGL entre

Iniciado por Fran, 31 de Enero de 2007, 07:42:04 PM

« anterior - próximo »

marcode

Al parecer las display list son mejores cuando hay muchos cambios de estado. Entonces por ejemplo para un campo de estrellas estático con miles de puntos de diversos colores, tamaños, trasparencias, etc. será mucho más eficaz que un VBO.

Pero si quieres dibujar un objeto con bastantes vértices, múltiples veces, mejor que resida en un VBO y sólo hay que enviar los comandos de cambio de matriz y render las veces necesarias, más eficaz aún si hay que modificar la geometría en cada uno de ellos o en cada frame.

En cuanto a lo de los strips, hace años leí que a las tarjetas les venía muy bien los triángulos de esa manera.  Lo que está claro es que una tira de triángulos tiene la mitad de vértices en un strip que dibujados uno a uno (y se evita el indexado).
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Pogacha

Cita de: "Pogacha"En realidad el display list no se usa para nada.
Tienes que tratar de olvidarte de el.
La verdad es que exageré ... reformulo: a mi no me sirvió nunca  :oops:

Razones por la cual no me sirvieron:
- No te permite oclusion dinamica, en realidad nada dinamico.
- Diferencias de performance despreciables, ya que el volumen de lo que es apto para ser tratado con esto es muy poco.
- No hay contracara en DX.

En lo que yo trabajé no me sirvió nunca, pero no quita que pueda ser usado en muchas cosas. Igual opino que es una optimización fina y que hay que centrarse primero en los mas grandes como el VBO.

Saludos y pido disculpas.

Fran

Cita de: "marcode"Al parecer las display list son mejores cuando hay muchos cambios de estado. Entonces por ejemplo para un campo de estrellas estático con miles de puntos de diversos colores, tamaños, trasparencias, etc. será mucho más eficaz que un VBO.

Pero si quieres dibujar un objeto con bastantes vértices, múltiples veces, mejor que resida en un VBO y sólo hay que enviar los comandos de cambio de matriz y render las veces necesarias, más eficaz aún si hay que modificar la geometría en cada uno de ellos o en cada frame.

En cuanto a lo de los strips, hace años leí que a las tarjetas les venía muy bien los triángulos de esa manera.  Lo que está claro es que una tira de triángulos tiene la mitad de vértices en un strip que dibujados uno a uno (y se evita el indexado).

Esto estaba preguntando: Es q tengo el siguiente problema. Estoy pasando una librería a JOGL . En tarjetas modernas corre q se las pela.Uso DisplayLists xq se adaptaba muy bien a como estaba hecha la librería inicial y no tenia ningun problema hasta que.... hasta q se me ocurrió ver como iba en una tarjeta de 64MB un poco antigua y una de 8MB (ya sé q ahí tiene q ir lento pero he visto ir cosas mas rapidas en ella). Entonces ahora mismo la única optimización que se me ocurre -xq eso vi desde el principio que podría suponer un problema- sin meterme en mucho lio es coger mis triángulos, ordenármelos para hacer bien strips y tirarlo así xq al fin y al cabo son muchos menos vertices que triángulo a triángulo. Quería saber si alguien habia hecho comparaciones de velocidad. Ya puestos, Pogacha, tu que eres un maquina, ¿¿tienes por ahi algun algoritmo que dados una lista de vértices  y una lista de triangulos con sus tres vértices apuntados de esa lista de vértices te permita ordenarlos bien para hacer strips ???. Cda vértice tb tiene una lista de sus triángulos. Lo de los VBO me parece genial , pero es que he estado rpobando, no todas las tarjetas q he probado lo tienen y además debería cambiar demasiadas cosas para un 5% de mejora.

marcode

Salvo algunas circustancias, no creo que haya mucha diferencia de velocidad entre los vertex array y los vertes object. Pero como los segundos son a partir de la versión 1.5, pues lo mejor que puedes hacer es usar los otros.

En cuanto a lo de los strips, a menos que puedas hacer tiras largas es mejor que esté indexado.

La verdad es que si quieres optimizar tendrías que especificar detalladamente la forma de dibujar de cada objeto o grupos de objetos, un montón de trucos e historias más, y probar mucho.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Fran

Cita de: "marcode"Salvo algunas circustancias, no creo que haya mucha diferencia de velocidad entre los vertex array y los vertes object. Pero como los segundos son a partir de la versión 1.5, pues lo mejor que puedes hacer es usar los otros.

En cuanto a lo de los strips, a menos que puedas hacer tiras largas es mejor que esté indexado.

La verdad es que si quieres optimizar tendrías que especificar detalladamente la forma de dibujar de cada objeto o grupos de objetos, un montón de trucos e historias más, y probar mucho.

Ya ya. Para empezar evidentemente mis elementos arrays of objetcs que te permiten dibujar n objetos ioguales con una sola escritura los estoy implementando con Lists xq tan a huevo, pero tb tengo claro que con los objetos q me enfrento habitualmente, hacer los strips es factible y sencillo. El problema es q es una herramienta genérica y qisiera no tener q pedir al usuario nada. Sino q On the fly, la herramienta lea el 3ds, OBJ, etc lo ordene adecuadamente y entonces con eso cree la lista pero ya con strips siempre q pueda. Y quiero usar eso y no otra cosa por compatibilidad hacia atrás. No quiero mensajitos de no dispones de esto en niungn caso xq el soft q toy haciendo pretendo q sea de gran tirada y no voy a estar yo alli. Pero como se hace on the fly, pretendo no penalizar mucho en el tiempo de carga.

Fran

Cita de: "Pogacha"
Cita de: "Pogacha"En realidad el display list no se usa para nada.
Tienes que tratar de olvidarte de el.
La verdad es que exageré ... reformulo: a mi no me sirvió nunca  :oops:

Razones por la cual no me sirvieron:
- No te permite oclusion dinamica, en realidad nada dinamico.
- Diferencias de performance despreciables, ya que el volumen de lo que es apto para ser tratado con esto es muy poco.
- No hay contracara en DX.

En lo que yo trabajé no me sirvió nunca, pero no quita que pueda ser usado en muchas cosas. Igual opino que es una optimización fina y que hay que centrarse primero en los mas grandes como el VBO.

Saludos y pido disculpas.

En DX cuando lo usaba (alla por la version 5 y 6) habia una orden q te permitia pasar un array de n vertices y luego como se montaban los triangulos a partir de eso, q era lo q necesitaria aqui.

senior wapo

Me he releido varias veces el hilo y con tantas vueltas que dais no se que buscas al final, asi que si te contesto lo que no has preguntado pues ignoralo =p

Sin usar VBO, también puedes pasarle a OpenGL los vertices por un lado y los indices que usas por otro:

 glDrawElements( GL_TRIANGLES, cuantosindices, GL_UNSIGNED_SHORT, arrayindices );

los vertices los saca de un array que le hayas pasado antes con:

 glVertexPointer( );
 glNormalPointer( )
 glColorPointer( );
 glTexCoordPointer( );

Las componentes posicion, normal, color, u/v, etc de los vertices pueden estar cada uno por su cuenta en arrays separados o todo intercalado en el mismo array. Mirate la documentación de esas llamadas.

Si vas a mandar el mismo array varias veces, tienes una extensión que te permite indicarle que el array no lo tocas y que puede asumir que no ha cambiado, lo cual le permite al driver optimizar donde lo pone y subirlo a la tarjeta una sola vez:
 
  EXT_compiled_vertex_array

Te dejo un link de un documento al respecto de como lo usaba en Quake3 un tal John Carmack:

http://www.gamers.org/dEngine/quake3/johnc_glopt.html

PD: Me da pereza ponerle las tildes al post.

EDIT: Ahora que releo el link que he puesto, en el codigo del Quake3 debe de haber una rutina para calcular strips, si querias ver una...

Fran

Cita de: "senior wapo"Me he releido varias veces el hilo y con tantas vueltas que dais no se que buscas al final, asi que si te contesto lo que no has preguntado pues ignoralo =p

Sin usar VBO, también puedes pasarle a OpenGL los vertices por un lado y los indices que usas por otro:

 glDrawElements( GL_TRIANGLES, cuantosindices, GL_UNSIGNED_SHORT, arrayindices );

los vertices los saca de un array que le hayas pasado antes con:

 glVertexPointer( );
 glNormalPointer( )
 glColorPointer( );
 glTexCoordPointer( );

Las componentes posicion, normal, color, u/v, etc de los vertices pueden estar cada uno por su cuenta en arrays separados o todo intercalado en el mismo array. Mirate la documentación de esas llamadas.

Si vas a mandar el mismo array varias veces, tienes una extensión que te permite indicarle que el array no lo tocas y que puede asumir que no ha cambiado, lo cual le permite al driver optimizar donde lo pone y subirlo a la tarjeta una sola vez:
 
  EXT_compiled_vertex_array

Te dejo un link de un documento al respecto de como lo usaba en Quake3 un tal John Carmack:

http://www.gamers.org/dEngine/quake3/johnc_glopt.html

PD: Me da pereza ponerle las tildes al post.

EDIT: Ahora que releo el link que he puesto, en el codigo del Quake3 debe de haber una rutina para calcular strips, si querias ver una...


Muchísimas gracias. Creo q esto es exactamente lo q estaba buscando. Si lo es lo posteare xq imagino que le interesará a más gente. El bueno de Carmack.... mamonazo  :wink:

marcode

A ver si no te cuesta mucho implementarlo, ya nos comentarás (y si puedes explicar o mostrar la función mejor). Aunque también siento ser pesimista pero no creo que obtengas una mejora sustancial para una mala tarjeta gráfica, no es lo mismo de 30 frames optimizar hasta conseguir 40, que de 3 conseguir 4.

También hay que tener en cuenta que en un modelo típico no se pueden "stripear" todos los triángulos porque obligaría a compartir normales y coordenadas de textura. También si se dibujan grandes zonas y se consume todo el tiempo en la rasterización, no se ganará tampoco mucho.

Prueba otros trucos como reducir el tamaño de las texturas, ordenar correctamente los objetos en el zbuffer, aplicar un LOD progresivo, y sobre todo no dibujar objetos que no sean visibles.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Fran

Cita de: "marcode"A ver si no te cuesta mucho implementarlo, ya nos comentarás (y si puedes explicar o mostrar la función mejor). Aunque también siento ser pesimista pero no creo que obtengas una mejora sustancial para una mala tarjeta gráfica, no es lo mismo de 30 frames optimizar hasta conseguir 40, que de 3 conseguir 4.

También hay que tener en cuenta que en un modelo típico no se pueden "stripear" todos los triángulos porque obligaría a compartir normales y coordenadas de textura. También si se dibujan grandes zonas y se consume todo el tiempo en la rasterización, no se ganará tampoco mucho.

Prueba otros trucos como reducir el tamaño de las texturas, ordenar correctamente los objetos en el zbuffer, aplicar un LOD progresivo, y sobre todo no dibujar objetos que no sean visibles.

Lo q estoy haciendo es una herramienta muy genérica. LOD tengo. Pero el ejemplo en el q estoy ahora mismo son 100.000 triángulos y no puedo en principio prescindir ya de ninguno

PIM

Hola. Bien pues como se ha comentado los vbo son la mejor alternativa para un dibuja más rápido y eficiente de cualquier polígono. Los vbo son la mejor opción cuando uno pretende dibujar por ejemplo modelos que contengan una animación, ya sea basada en frames o en esqueletos.

Las display list, son más bien para dibujar modelos estáticos (sprites, mesas, sillas, autos de adorno, edificios, etc) y que no van a tener en ningún momento, algún tipo de animación. Con esto no digo que no puedan ser movidos (por ejemplo que una silla sea lanzada hacia un personaje) o escalados, pues básicamente me refiero a que no contienen una animación interna.

Aunque también como se ha dicho, las display list han caido en lo obsoleto, pues los vbo, pueden servir tanto para objetos estáticos como para objetos animados.

Ojalá esto ta haya disipado la duda, y si no, con gusto lo comentamos.

Saludos.
;)

TrOnTxU

Vicent: Linked-In  ***  ¡¡Ya tengo blog!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.