Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: angelfmarcos en 25 de Junio de 2006, 04:21:57 PM

Título: Optimización y multithreading en opengl
Publicado por: angelfmarcos en 25 de Junio de 2006, 04:21:57 PM
Hola

Quería saber cual es la mejor manera de optimizar el renderizado. ¿Usando display list o con Vertex Buffer Objects?

Ahora mismo estoy usando display list, y tengo un problema al cargar escenas en segundo plano. Lo que hago es cargar objetos y demás en otro hilo. El problema viene al crear las display list que luego al renderizarlas no sale nada. por lo que he podido leer el problema puede venir de realizar las operaciones de dibujado para crear el display list en un hilo aparte. ¿cómo podría solucionar esto?

Un saludo.
Título: Optimización y multithreading en opengl
Publicado por: samsaga2 en 25 de Junio de 2006, 07:42:19 PM
Los display list son mas rapidos que los vertexs buffers, el problema de los primeros es que son estaticos mientras que los vertexs buffers puedes ir modificandolos sobre la marcha.

Nunca nunca uses OpenGL en un thread distinto de en donde lo hayas inicializado. Lo que puedes hacer es un implementar un sistema de mensajes para comunicarse entre los threads y cuando uno necesite crear un display list enviarle un mensaje al thread propietaro del OpenGL.
Título: Optimización y multithreading en opengl
Publicado por: tamat en 26 de Junio de 2006, 01:03:15 AM
pues si no es bueno hacer threads con opengl como haces lo de cargar las texturas en threads aparte para evitar parones en las aplicaciones?
Título: Optimización y multithreading en opengl
Publicado por: senior wapo en 26 de Junio de 2006, 01:18:24 AM
Cita de: "tamat"pues si no es bueno hacer threads con opengl como haces lo de cargar las texturas en threads aparte para evitar parones en las aplicaciones?

Un hilo secundario carga los datos de disco y los deja en un formato cómodo para el motor encolados para que el hilo de render los use para crear recursos OpenGL y utilizarlos.

Necesitas una cola de comandos+datos para comunicar los datos entre los hilos.

Mirad los fuentes del quake 3, lleva soporte multihilo para el render.
Título: Optimización y multithreading en opengl
Publicado por: tamat en 26 de Junio de 2006, 11:33:02 AM
interesante, cuando dices lo de formatos cómodos te refieres a DDS? y de ser así, cómo convierto mis texturas a ese formato?
Título: Optimización y multithreading en opengl
Publicado por: senior wapo en 26 de Junio de 2006, 01:37:54 PM
Cita de: "tamat"interesante, cuando dices lo de formatos cómodos te refieres a DDS? y de ser así, cómo convierto mis texturas a ese formato?

No, me refiero a tener un buffer listo para pasarselo al API OpenGL. Por ejemplo, en el caso de una textura, tener el buffer de pixels listo para pasarselo a glTexImage2D sin mas conversiones (y los mipmaps ya calculados también).

Desacopla carga/preparación de datos por un lado y llamadas al API gráfico por el otro.
El tiempo que emplea el API en subir datos a la tarjeta tendrá bloqueado tu hilo de render, asi que es mejor que la preparación de los datos para la siguiente llamada al API grafico la realices mientras tanto en paralelo en otro hilo.

Tu hilo de render se limita a hacer llamadas al API 3D y los datos que necesita se los calculas en otro hilo.

Con un solo hilo:
  Leer textura de disco -> transformar a formato de textura soportado por esta tarjeta-> subir a la tarjeta

Con 2 hilos:
 - hilo calculo:
  Leer textura -> convertir a formato soportado -> encolar para carga -> calcular vertices -> encolar para pintado -> calcular ....

-Hilo render
 Subir buffer encolado a textura VRAM -> subir vertices encolados a Vertex Buffer en VRAM -> dibujar triangulos -> ....
Título: Optimización y multithreading en opengl
Publicado por: tamat en 13 de Julio de 2006, 11:29:25 AM
Una duda referente a lo que decias de tener los midmaps hechos, ¿como se hace para obtenerlos? existe alguna manera de obtener los datos de una textura por completo de opengl? me refiero a textura y midmaps.

Y otra duda, puedo crear yo a mano los midmaps y subirlos junto con la textura? Es que tengo un problema con el sistema nativo de opengl para generarlos, me pilla pixels de una región que no quiero que influya en el midmap.

Gracias
Título: Optimización y multithreading en opengl
Publicado por: senior wapo en 13 de Julio de 2006, 02:22:03 PM
Los mipmaps los generas tu con una rutina que lea del bloque de pixels original y escriba en el bloque destino tras aplicar una operación (un filtro, vamos).

La forma más simple es escribir la media de los cuatro pixeles correspondientes del nivel anterior de mipmap. Hay otras formas, como calcular los pixeles a partir siempre del nivel original pero tomando en consideración un área más grande, y filtros varios que nunca me han interesado porque el primer método me parece que da una calidad pasable y es sencillo.

Para subir a la tarjeta los pixeles de un nivel de mipmap determinado tienes el segundo parámetro de glTexImage, que normalmente lo pones a cero (nivel principal) pero puedes poner 1,2,3....etc.

http://www.mevis.de/opengl/glTexImage2D.html

Si lo que quieres es leer los datos de una textura/buffer tienes glReadPixels / glReadBuffer pero que yo sepa no permiten leer los niveles mipmap que ha generado la tarjeta/drivers. No puedo decirte más porque nunca los he utilizado, busqué el API en su momento para cuando necesitase implementar capturas de panatalla.

A ver si eso te sirve.
Título: Optimización y multithreading en opengl
Publicado por: tamat en 13 de Julio de 2006, 03:16:14 PM
muchas gracias, le echaré una ojeada