Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Fran en 31 de Enero de 2007, 07:42:04 PM

Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 31 de Enero de 2007, 07:42:04 PM
Listas + introducir trinagulos uno a uno
Listas + Triangle Strips
VertexBuffers+Vertex.....

En cuanto a velocidad?
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: marcode en 31 de Enero de 2007, 10:39:57 PM
sin duda los VBO es lo más rápido.

http://www.spec.org/gpc/opc.static/vbo_whitepaper.html
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 12:30:24 AM
Tienes alguna comparativa? Cuanto mas rapido es ? 100%?
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: ethernet en 01 de Febrero de 2007, 09:13:58 AM
Imagino que las display list de toda la vida crearán un vbo estático, con lo cual en ese caso te dará igual.

Por lo que se tira ahora es usar vbo, a porder ser estáticos y aparte optimizar los vértices para que no haya más fallos de caché de los debidos.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: marc_opolo en 01 de Febrero de 2007, 10:06:53 AM
Segun he leido, mas alla de que uses d3d u ogl, lo mas rapido seria usar vertex buffers estaticos, y triangle strips.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 10:08:32 AM
Puf! No me vale. En el tipo de tarjetas q quiero cubrir (tarjetas de hace 1 año baja gama (64MB)) no están esas extensiones (lo he probado con algunas demos bajadas de Inet) y en las modernas van tan rápidas q aunq lo implemente q lo voy a implementar si está disponible) me sirve hoy día para poco. Alguna idea para acelerar q no sean las displaylists (q ya las tengo)?
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: vincent en 01 de Febrero de 2007, 11:04:30 AM
Pues vertex arrays a poder ser indexados. Yo creo que los vertex buffer objects te los implementan las tarjetas que comentas ( mi geforce 4 ti de hace 5 años lo hace ).

Saludos.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 11:16:59 AM
Cita de: "vincent"Pues vertex arrays a poder ser indexados. Yo creo que los vertex buffer objects te los implementan las tarjetas que comentas ( mi geforce 4 ti de hace 5 años lo hace ).

Saludos.

Es cherto. Me he equivocado. Lo q no soporta son los Shaders (he leido muy rápido). De todos modos una de las cosas q me he bajado de un alemán (bastante ilustrativo) es la comparativa de una misma demo con ambas cosas (DisplayList y vertexArray) y el DisplayList le gana por goleada a vertexArray en esta tarjeta (otra cosa es q esté bien implementado)
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Pogacha en 01 de Febrero de 2007, 11:33:47 AM
En realidad el display list no se usa para nada.
Tienes que tratar de olvidarte de el.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: vincent en 01 de Febrero de 2007, 11:47:35 AM
Exacto, y a la que quieras modificar la geometria ( nueva iluminación, animación, etc, etc ) baja enormemente su rendimiento.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 11:50:55 AM
from testing i have done on static terrain i.e brute terrain, i have found display lists to be faster than any VBO method i have tried, putting both the vertices into a VBO and the indices did come pretty close though.


http://www.gamedev.net/community/forums/topic.asp?topic_id=355262

¿Xq dices q si quieres hacer movimiento baja la velocidad mucho?
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: ethernet en 01 de Febrero de 2007, 12:03:19 PM
Cita de: "Pogacha"En realidad el display list no se usa para nada.
Tienes que tratar de olvidarte de el.


¿? Yo los uso para la geometría estática y me van la mar de bien.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 12:38:18 PM
Cita de: "Pogacha"En realidad el display list no se usa para nada.
Tienes que tratar de olvidarte de el.

¿?

Pues en OpenGL.org lo dan como uno de los métodos para optimizar y x lo q he visto es ampliamente usado

http://www.opengl.org/wiki/index.php/Performance

Además de q las comparativas q he visto no  hay una diferencia enorme entre usar una cosa y otra (para mi desgracia).

Imagino q tu no lo usarás, pero no es una opinión generalizada por lo q he visto. De hecho a dia de hoy casi se usa mas q los VBO aun.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: marc_opolo en 01 de Febrero de 2007, 12:56:51 PM
Buenas,

no soy un experto en OpenGL, pero me da la impresion (por lo que vi) de que las "display lists" se pueden implementar como vertex buffers (dentro del driver). Si es asi, no es de extrañar que las display lists y los VBO ofrezcan performance similar.
En cualquier caso, lo logico seria que una display list envie los vertices a la memoria de la tarjeta, y de ahi que sirvan solo para geometria estatica (a menos que uses un vertex shader).

No hay en opengl vertex buffers dinamicos, pensados precisamente para geometria dinamica?

Por otro lado, tambien hay otras cosas para optimizar:
-topologia de las mallas
-cantidad/tamaño de texturas, y cambio de texturas por frame
-Z-test

Saludos!
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 01:00:57 PM
No entiendo y perdonad mi burrez xq solo sirven para geometrias estáticas.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: marcode en 01 de Febrero de 2007, 03:25:44 PM
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).
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Pogacha en 01 de Febrero de 2007, 03:45:03 PM
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.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 04:33:19 PM
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.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: marcode en 01 de Febrero de 2007, 05:19:59 PM
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.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 05:29:09 PM
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.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 01 de Febrero de 2007, 05:31:10 PM
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.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: senior wapo en 02 de Febrero de 2007, 01:51:07 AM
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...
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 02 de Febrero de 2007, 09:24:35 AM
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:
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: marcode en 02 de Febrero de 2007, 03:49:49 PM
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.
Título: Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: Fran en 02 de Febrero de 2007, 07:25:16 PM
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
Título: Re:Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: PIM en 25 de Julio de 2016, 05:41:57 PM
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.
;)
Título: Re:Alguien ha probado si hay mucha diferencia en OpenGL entre
Publicado por: TrOnTxU en 25 de Julio de 2016, 07:14:09 PM
... mmm no sé ... yo lo veo my necro