Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Optimización y multithreading en opengl

Iniciado por angelfmarcos, 25 de Junio de 2006, 04:21:57 PM

« anterior - próximo »

angelfmarcos

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.

samsaga2

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.

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?
Por un stratos menos tenso

senior wapo

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.

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?
Por un stratos menos tenso

senior wapo

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 -> ....

tamat

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
Por un stratos menos tenso

senior wapo

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.

tamat

Por un stratos menos tenso






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.