Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





OpenGL. Trabajar con varias escenas a la vez?

Iniciado por Elelegido, 02 de Marzo de 2008, 02:21:40 PM

« anterior - próximo »

Elelegido

Buenas, ando un poco perdido con OpenGL y quería saber si me podríais echar una mano. Trabajo con SDL, y me he dado cuenda de que sin las gráficas por hardware no voy a ninguna parte.

En mi juego, quiero que aparezcan varias "camaras" enfocando objetivos distintos, viendose por lo tanto la pantalla dividida por el número de camaras (pensado así para soportar varios jugadores en el juego, donde cada uno pueda moverse a su antojo por su camara). Entonces, quería saber si hay algún modo sencillito de dividir el worldspace en varios contextos que pudiese manejar de igual manera. Otra cosa que para el caso, me vendría bien es algo para trasladar todo el sistema de coordenadas.

Sinceramente no quiero entretenerme mucho con el OpenGL, y tirar de libros ya que lo voy a usar de un modo muy simple (2D), y me urge más avanzar en otras cosas. Lo digo porque más de uno se tiene que estar tirando de los pelos con las cosas que estoy diciendo sobre este tema xD.

Una última duda: alguien sabe si hay alguna pega en usar este atributo? SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 )

tamat

usando glViewport y glulookat

Lo segundo deduzco que es para que el swapbuffers sea automatico, en tal caso no veo el problema en poner la linea de swapbuffers al final de tu linea de render.
Por un stratos menos tenso

Buffon

Si lo que quieres es hacerlo tipo 3DStudio, es como dice tamat.


si tu pantalla es de 800x600

// ---------------- 1
glViewport(0,0,400,300);
//Dibujo en la pantalla 1.

// ---------------- 2
glViewport(400,0,400,300);
//Dibujo en la pantalla 2.

// ---------------- 3
glViewport(0,300,400,300);
//Dibujo en la pantalla 3.

// ---------------- 4
glViewport(400,300,400,300);
//Dibujo en la pantalla 4.



 --------------------------------------
|                  |                   |
|        3         |         4         |
|                  |                   |
 --------------------------------------
|                  |                   |
|        1         |         2         |
|                  |                   |
 --------------------------------------

Elelegido

Lo he estado probando, y he visto que glViewport reescala la proyección, cuando a mi lo que me interesa es que las escalas permanezcan intactas. Lo he probado también con glScissors y glTranslatef, y casi resulta como yo quería:



El problema es que sólo funciona bien para 2 escenas dispuestas en horizontal. Si lo purebo en vertical, o con 4 cámaras tal y como lo muestra Buffon, glScissors se carga la proyección de cada escena cuando antes no lo hacía, lo cual me lía un poco.

Este es el fragmento de código que recrea cada escena:

glMatrixMode(GL_MODELVIEW);
glTranslatef(area->getX(),area->getY(),0.0);

glEnable(GL_SCISSOR_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

for (int i=0;i<Capas.size();i++) {
Capas[i]->redraw();
}

glScissor(area->getX(),area->getY(),area->getW(),area->getH());

glDisable(GL_SCISSOR_TEST);
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

tamat

Si usas proyecciones sin perspectiva entonces mirate glOrtho, junto con glViewport haran todo lo que necesitas.
Por un stratos menos tenso

Elelegido

Gracias tamat, ya he entendido el uso de esas funciones y me sirven de maravilla para lo que pretendía hacer.

Otra cosa, sobre lo que comenté también en mi primer mensaje de este hilo. Me he encontrado con que SDL_GL_SWAP_CONTROL no trabaja bien en todas las TG. Del mismo modo SDL_GL_DOUBLEBUFFER tampoco es suficiente para activar el Vsync en algunos PCs (bueno, esto realmente no me ha sido suficiente en ninguno de los PCs donde lo he probado). Me podeis dar algún consejo para poder casi garantizar la sincronización vertical en mi programa usando SDL+OpenGL?






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.