Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Loover en 01 de Enero de 1970, 01:00:00 AM

Título: 2d en Opengl
Publicado por: Loover en 01 de Enero de 1970, 01:00:00 AM
                                ¿Cual es el mejor método para usar gráficos 2d en opengl?
Es decir, que me recomendais... ¿que monte las imágenes sobre quads? ¿O quizás sería más rapido sobre dos triangulos (formando un rectángulo)? Incluso... ¿podría montar cada imagen rectangular sobre un único polígono y dejar las esquinas transparentes?
¿Qué es lo más óptimo? ¿Conoceis algún tutorial para opengl orientado a las 2d?

                               
Título: 2d en Opengl
Publicado por: Javi SJ Cervera en 01 de Enero de 1970, 01:00:00 AM
                                Mira en nehe.gamedev.net. Hay tutoriales de proyeccion ortogonal q tb tocan el tema de las 2D en OpenGL. El tutorial 21 puede serte util.
                               
Título: 2d en Opengl
Publicado por: ethernet en 01 de Enero de 1970, 01:00:00 AM
                                Tenia entendido q el driver pasaba de quads a triangle strip.
Saludos
                               
Título: 2d en Opengl
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                Por eso mismo, si le pasas triangulos, una faena que le ahorras.
                               
Título: 2d en Opengl
Publicado por: Tei en 01 de Enero de 1970, 01:00:00 AM
                               
Citar
El 2002-09-29 21:59, NeLo escribió:
Por eso mismo, si le pasas triangulos, una faena que le ahorras.


yo lo haria usando la forma mas sencilla, y luego programando bien :riendo:                                
Título: 2d en Opengl
Publicado por: Althermuund en 01 de Enero de 1970, 01:00:00 AM
                                Porqué no pruebas SDL, a ver que te parece?

http://www.libsdl.org

Es una librería gráfica orientado al 2D (muy sencillito) y con soporte a OpenGL.



                               
Título: 2d en Opengl
Publicado por: Loover en 01 de Enero de 1970, 01:00:00 AM
                                Bueno, esto marcha.
He programado dos funciones tales que:

// Carga la imagen
int imagen = Imagen2d.LoadBmp("imagen.bmp");

// Dibuja la imagen
Imagen2d.DrawPic (x, y, z, imagen);

Montan la textura sobre un GL_TRIANGLE_STRIP definido por 4 vértices.

Funciona bien, incluso he probado imagenes muy grandes (1024, 768) y se mueven con el ratón muy fluidas.
Ahora bien, solo funciona cuando el ancho de la imagen es múltiplo de 8. Esto se debe, según he leido, a la forma en que trabaja internamente OpenGl.
¿Cómo puedo solucionarlo?
                               
Título: 2d en Opengl
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                Las tarjetas gráficas (la gran mayoría) sólo soportan texturas con tamaños potencia de dos.

Es decir, si le pasas una textura de tamaño 127*71, pues no la puede almacenar.

Tanto el ancho como el alto deben ser potencia de dos.

También deberías mirar el tamaño máximo de textura que soporta la tarjeta.

Saludox.

_________________
be manso

[ Este Mensaje fue editado por: NeLo el 2002-10-01 16:34 ]                                
Título: 2d en Opengl
Publicado por: Loover en 01 de Enero de 1970, 01:00:00 AM
                                Ok, entonces a la hora de dibujar una imagen cualquiera... ¿como lo hago? ¿es que en OpenGl no hay algo tan sencillo como tiene Direct3D a la hora de dibujar sprites? Por mas que busco no lo encuentro.                                
Título: 2d en Opengl
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                El quadrado (2 triángulos) sobre el cual dibujas la imagen, la puedes hacer del tamaño que quieras.

Entonces, lo primero sería crear una textura de un tamaño potencia de 2 que contenga la imagen que tú quieras, y del tamañao que quieras. Por ejemplo, la imagen puede ser de 137*79 y estar contenida en una textura de 256*128.

Después, lo único que tendrías que hacer es ajustar las coordenadas de textura para que la imagen quede perfecta sobre tu quad, que sería también de 137*79 píxels.

Esto se hace con la fórmula:
u = Width_Image / With_Texture
v = Height_Image / Height_texture

Con lo cual, en el ejemplo que he puesto antes, las coordenadas de textura quedarían de la siguiente forma:

u = 137 / 256 = 0,53515625
v = 79 / 128 = 0,6171875

Fácil, ¿no?

Saludox.

_________________
be manso

[ Este Mensaje fue editado por: NeLo el 2002-10-01 18:35 ]                                
Título: 2d en Opengl
Publicado por: Loover en 01 de Enero de 1970, 01:00:00 AM
                                Te quiero                                
Título: 2d en Opengl
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                A la cola...

xDDDDD

De nada Loover, un placer :ojo:
                               
Título: 2d en Opengl
Publicado por: Loover en 01 de Enero de 1970, 01:00:00 AM
                                Más preguntas,

Ahora imagina que la imagen es de 1024x768. Al ser tan grande no conviene meterla como textura, ¿verdad? Pues habrá tarjetas que no soporten ese tamaño de textura.
Entonces lo que convendria es que toda imagen de pantalla estuviera formada por (por ejemplo) quads de 64x64 y en los bordes (para que ajuste) quadas del tamaño que sean necesarios (estos últimos tb con textura y ajustada de la manera que me has dicho).
Esta parece ser que sería la forma óptima, ¿no?

PD: Oye, pues si que es tocha mi Radeon 7200 que soporta textura de 1024x768... ¿cómo puedo saber el tamaño máximo que soporta una tarjeta dada?
                               
Título: 2d en Opengl
Publicado por: [Over] en 01 de Enero de 1970, 01:00:00 AM
                                Hola amigo Loover.

Nunca he usado Opengl, pero te contaré mi experiencia con eso mismo que tu quieres con Direct3D, dado que la imagen la vas a dibujar como si una textura fuera, es logico pensar que salvo tamaños potencia de 2, no vas a poder dibujar, tu problema es obvio, no todas las tarjetas graficas soportan el mismo tamaño de texturas, las de ultima generacion trabajan a 1024x1024, lo cual es suficiente para montar toda la imagen en una sola textura, pero hay gente que aun sigue sin tener esas tarjetas (yo jeje) y solo soprtan texturas de 256x256 e inclusive menos (128x128). Lo ideal es crearte algo que cargue una imagen de cualquier tamaño, la leas y la monte por texturas, cuantas sean necesarias. Si tu tarjeta permite texturas de 1024, pues montaras la imagen en una sola textura y dibujas una sola texturas, ya es discutible si esto es lo mas optimo y rapido o no, eso ya no lo sé. Pero si no permite texturas tan amplias, deberas ir leyendo esta imagen y escribiendo bloques de datos del tamaño elegido o el maximo permitido por la tarjeta y guardando estos datos (pixeles) en la textura (creada del tamaño elegido o maximo permitido), tal que, al final te quedará un array de texturas que dibujadas en un orden correcto, mostrará la imagen elegida. No te posteo codigo ni nada, porque yo lo he hecho en DirectX.

Chao.

PD: Buena suerte amigo, los libros van en marcha :lengua:.                                
Título: 2d en Opengl
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                De 64*64 no, sería mejor cortarlas segun el tamaño máximo de textura que acepte la tarjeta, aunque quizás pasar de 1024*768 sea demasiado.

Cuando cargues la textura, si te da un error de tipo GL_INVALID_VALUE, seguramente sea por el tamaño de la textura.

Para obtener el tamaño máximo de textura que soporta, puedes usar la función:

glGetIntegerv( GL_MAX_TEXTURE_SIZE, &TextureSize );

Esta función devuelve el ancho o el alto máximo de la textura.

Es todo lo que sé, quizás alguien que use OpenGL de manera habitual sepa algo más o una forma mejor.

En Direct3D tenemos el valiosísimo GetDeviceCaps xDD

Saludox.
                               
Título: 2d en Opengl
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                Bueno, mi vieja GeForce 256 soporta texturas de 2048*2048 :riendo:

Más que suficiente creo yo.