Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





2d en Opengl

Iniciado por Loover, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Loover

                                ¿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?

                               
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Javi SJ Cervera

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

ethernet

                                Tenia entendido q el driver pasaba de quads a triangle strip.
Saludos
                               

NeLo

                                Por eso mismo, si le pasas triangulos, una faena que le ahorras.
                               
Drowning deep in my sea of loathing

Tei

                               
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:                                

Althermuund

                                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.



                               

Loover

                                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?
                               
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                                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 ]                                
Drowning deep in my sea of loathing

Loover

                                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.                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                                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 ]                                
Drowning deep in my sea of loathing

Loover

                                Te quiero                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                                A la cola...

xDDDDD

De nada Loover, un placer :ojo:
                               
Drowning deep in my sea of loathing

Loover

                                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?
                               
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[Over]

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

NeLo

                                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.
                               
Drowning deep in my sea of loathing






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.