Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Texturas En Opengl

Iniciado por shephiroth, 19 de Enero de 2005, 12:53:38 AM

« anterior - próximo »

shephiroth

 Muy buenas.

Trabajo sobre c++ y actualmente bajo opengl.....no estoy utilizando ningun motor, puesto que antes de utilizar una librería creada por otra persona me gustaría intentar hacerlo por mi mismo para saber si soy capaz de lograr el mismo efecto (menos bonito, menos rapido......pero el mismo efecto xDD).........y me encuentro bajo un problema.

Tras buscar mucha info por inet la mejor manera de manejar un mapa en 2d es mediante tiles........dejando de lado el como almacenar el mapa, me tiene bastante preocupado como hacer esto de los tiles desde el punto de vista gráfico. En la mayoría de las paginas comentan el hacer un bitmap con muchos tiles y por codigo leer solo el tile q necesite.......en todas las paginas que hay codigo lo hacen bajo VB+dx y encontrandome en c++ y opengl no encuentro nada de informacion.

Alguien me podría explicar como teniendo un archivo mapa.bmp (o mapa.tga en mi caso) puedo crear 16/64 texturas diferentes, cada una con un unico tile???? La memoria utilizada para las texturas es la misma, pero el manejo de las mismas es muy diferente.

GRACIAS ^^

[EX3]

 Y ke mas da ke el codigo este en VB, Delphi o Fortran? Yo casi siempre me ayudo para mis proyectos de VB con ejemplos escritos en C++. Lo de los tiles se supone ke es leyendo porciones de un mapa de bits (una imagen vamos) de 32x32 o 16x32, etc... depende lo ke kieras dibujar en pantalla, y luego vas dibujando el mapa segun a tu gusto con las porciones ke leas, para ke te hagas una idea es como hacer un mosaico, pieza a pieza:




Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

shephiroth

 Muy buenas.

Lo primero gracias por tu respuesta, la intencion es lo que cuenta ^^;

Lo segundo, no se si te fijaste, pero no me respondiste la pregunta........te quoteo dos frases:

CitarTras buscar mucha info por inet la mejor manera de manejar un mapa en 2d es mediante tiles........dejando de lado el como almacenar el mapa, me tiene bastante preocupado como hacer esto de los tiles desde el punto de vista gráfico

CitarAlguien me podría explicar como teniendo un archivo mapa.bmp (o mapa.tga en mi caso) puedo crear 16/64 texturas diferentes, cada una con un unico tile???? La memoria utilizada para las texturas es la misma, pero el manejo de las mismas es muy diferente.

La teoria me lo se........es mas, el mapa ya lo tengo codificado......hasta ahora toy trabajando con una textura y a la hora de dibujar seleccionar el tilo........pero me gustaría hacer una textura por cada tile......

GRACIAS ^^

vicho

 pues facil, lo que haces es cargar en una sola textura todas las tiles, y cuando hagas el glTexCoord2f
haces una proporsion y vas posicionando las cordenadas u,v de la textura correpondientes a x,y

seria algo asi

x=(cordenadaXenlaimagen/anchoimagen)
y=(cordenadaYenlaimagen/altoimagen)
glTexCoord2f(x,y);

supongamos que la imagen mide 320x240 usando y usando las cordenadas (10,20)(20,20)(20,30)(10,30) como las que encuadran a la tile

seria entonces

x=(10/320)
y=(20/240)
glTexCoord2f(x,y)

x=(20/320)
y=(20/240)
glTexCoord2f(x,y)

x=(20/320)
y=(30/240)
glTexCoord2f(x,y)

x=(10/320)
y=(30/240)
glTexCoord2f(x,y)

vicho

 ahora que lei tu respuesta pues tendrias que hacer un render to texture (gametutorials opengl 22) ;)

pero una cosa, creo que hacerlo como quieres hacerlo es una forma anti-economica de hacer las cosas

TheAzazel

 
Citar
La teoria me lo se........es mas, el mapa ya lo tengo codificado......hasta ahora toy trabajando con una textura y a la hora de dibujar seleccionar el tilo........pero me gustaría hacer una textura por cada tile......

Uhmm...me da q no eh?? jeje, si haces eso, vas a sobrecargar de tal manera el sistema grafico q te ira lento lento.... lo mejor es como ya te han explicado aki... un textura grandecita con todos los tiles en ellas y despues...a la hora de volcarlos..vas seleccionando los q te interesen....

nsL

 Esto tb me interesa a mi bastante....
Yo hasta ahora tenia pensado cargar 400 tiles (por decir un numero) en su correspondiente supeficie (yo estoy en SDL)y luego cargar cada una segun necesite, ¿¿pero estais diciendo q es mejor cargar todas en una superficie y seleccionarla con sus respectivas coordenadas en esa superficie para ponerla en pantalla?? es que toi dormido aun :P

De ser asi, que mas da tener 30 superficies que ocupen 2kb por ejemplo que una que ocupe 60kb...
Seguro q tiene su explicacion, asi q gracias de antemano :D

Saludos! B)
Yo no muero hasta la muerte -

vicho

 no es cargar cada una cuando se necesite, sino usar los datos de una textura ya cargada, SDL ofrece los SDL_Rect los cuales te dan esa posibilidad

shephiroth

 Buenas.

Mi "problema" es que demomento no quiero meterme en ningun entorno predesarrollado (salvo una librería de imagenes que toy buscando) como sería SDL o el Ilrith que os leo por ahi.......quiero hacer algo básico usando c++ opengl y el api de windows para las ventanas.

En cuanto a hacer una textura y dibujar la porcion del tile...como dije es lo que hago hasta ahora......pero ha llegado un momento que necesitaría poder crear una textura por tile.....

Habeis comentado que era una "forma anti-economica".....rogaría me lo explicaseis >_<
Si te refieres a q sobrecargaría a la tarjeta de video por hacer tantos cambios de textura......en parte si.....pero lo que llevo viendo hasta ahora es q estoy utilizando demasiado procesador y poca tarjeta grafica, por lo que no me importa "sacrificar" a la grafica en beneficio del procesador........actualmente tengo un p4 con 1 de ram, y grafica de 128 megas, pillo unos 200-220 fps......si lo pruebo con una tarjeta de 32 megas apenas pierdo 20-30 fps......mientras que si bajo el procesador (que no la ram) pierdo mas de la mitad de los fps >_<..........si bajo las dos cosas apenas llego a los 50 fps..............

Si no te referías a eso, explicamelo >_<

P.D: Viendo lo que hacen las tarjetas actuales en 3D, creo que da igual que cambie 30veces por frame de textura xDD en vez de 3 o 4 como hago ahora xDD

Pogacha

 Lo ideal es tener varias texturas de tamaño fijo, lo ideal seria 128x128 o 256 x 256 no mas de esto, a no ser que pretendas resoluciones de pantalla de 1024 x 768 y un target de buenas placas de video donde bueno el tamaño ya no importa, puedes poner texturas de 1024 x 1024 sin problema.
Tener muchas texturas no te beneficia en nada, es ralentizarlo sin sentido, es mas rapido para el ordenador calcular el desplazamiento de textura que hacer el cambio de textura, pues el procesador tambien trabaja en eso, y si el framerate decae por un ordenador menor es por el bus de datos y no puedes hacer nada con eso, trabajando en c++ para poner tiles en pantalla no hay forma de que tengas mal rendimiento, en un pentium 300 con una savage 4 puedes poner tiles a 60 fps llenando la pantalla de 640x480, a no ser que estes haciendo un buen clipping, o seas no uses un cuadtree o la matriz de la pantalla para determinar el tileado correspondiente y estes dibujando todo.
Saludos

Zaelsius

 Usar muchas texturas pequeñas es menos óptimo que varias grandes ya que,

la memoria de la tarjeta gráfica se fragmenta de igual manera que ocurre con la memoria principal. Utilizar 60 texturas pequeñas, e irlas cargando y descartando hace que la memoria se fragmente antes y se incrementa el número de transferencias por el bus del sistema(o lo que toque.. AGP, canal PCI-E.. en fin).

Imagina que tu juego usa 60 texturas/tiles, y que a la vez, almacenadas de manera consecutiva sólo caben 30 en memoria de video(por poner un ejemplo).. eso significa que en cada frame vas a hacer 30 transferencias de ram a video.. y como tendrás siempre alguna textura de diferente tamaño.. irán quedando huecos de mem. de video sin aprovechar... en definitiva el rendimiento baja. Con un juego pequeño quizá no se note mucho, pero si usas bastantes texturas, con PC's antiguos con un bus más lento deberia ser visible la bajada de FPS.

Es mejor minimizar las transferencias y usar bloques de memoria de mayor tamaño. P.ej. en en algunos juegos comerciales grandes, reservan cantidades fijas de RAM al comienzo y luego usan su propio gestor de memoria, para evitar fragmentar la memoria en exceso con peticiones pequeñas.


Buffon

 Otra cosa que tienes que tener en cuenta a la hora de crear las texturas, cuando las cargues en memoria, dependiendo el fichero que cargues estarás recogiendo RGB y no RGBA, para poder utilizar un colo como el keying tienes que tener una función, no dificil de hacer, que te pase un fichero RGB a tu memoria en formato RGBA.

como kieres hacer tu el motor no te digo como es la función ;) pero son 4 lineas de código.

como pista, cuando tengas que actualizar el A

buffer[3] = (textura.color == keying_color)?0:1;

:)

martiño

 Hola,

Solo queria llamar la atencion un problema bastante grave que tienen los mosaicos de tiles, que es el filtrado de texturas en los bordes de los mismos.

Cuando se usa filtrado bilineal para determinar el color de un pixel de usan los texels adyacentes de los niveles de mipmap correspondiantes, y las texturas de tiles se van a mezclar. Es decir si tienes un tile de tierra al lado de uno de hierba cuando tengas una celda de hierba que este a lo lejos, el los bordes con toda seguridad vas a ver unos cuantos pixeles del color de la tierra.

Quizas pueda solucionarse proporcionando mipmaps filtrados manualmente que no mezclen los tiles y dejando un borde entra tile y tile, pero no es un tema trivial.

Saludos.

_Grey

 
QUOTE (shephiroth)
Mi "problema" es que demomento no quiero meterme en ningun entorno predesarrollado (salvo una librería de imagenes que toy buscando) [/quote]

Si no quieres grandes librerias, y solo buscas una para que te facilite la tarea de cargar ficheros graficos mirate FreeImage, podras cargar MUCHOS tipos de ficheros graficos distintos y con mucha facilidad, es mas, no la sigo para ver que progresos se incorporan con el paso del tiempo y demas, pero cuando necesite de cargar diversos tipos de ficheros graficos distintos me facilito el trabajo mucho, y fue MUY facil, apenas la funcion de carga de la imagen y unas pocas de utilidad, te da mucha libertad, y es gratis total.

CitarRespecto a lo de dividir en varias texturas
Hace mucho que no toco OGL, pero si con glTexImage2D() creas la textura con algo tan simple como pasar el puntero a la zona de memoria donde se guarda, podrias intertar hacerlo "manualmente", creando varias imagenes partiendo de la inicial y haciendo glTexImage2D(), por cada una de ellas.
Pero eso si, NO ES RECOMENDABLE, cuando dicen lo de anti-economico, se refieren a que estas despilfarrando recursos, y haciendolo todo algo mas lento. Yo no lo haria.

Para finalizar, no se que mania os a entrado a todos en hacer cosas 2D con tecnologia 3D, Mas vale que aprobecheis para meter efectillos por que si no, no hace falta tanta libreria.

Saludos.

[EX3]

 
CitarPara finalizar, no se que mania os a entrado a todos en hacer cosas 2D con tecnologia 3D, Mas vale que aprobecheis para meter efectillos por que si no, no hace falta tanta libreria.
Yo en mi caso utilizo Direct Graphics (D3D8) mas que nada por que me proporciona efectos que en Direct Draw se pueden hacer pero a costa de perder multitud de rendimiento, vease el Alphablending o las rotaciones en una superficie, hay que lockear, calcular pixel a pixel, y eso en VB no es muy recomendable.

En D3D8 gracias a la interfaz DXSprite (IDXSprite en C++ creo) puedo "blitear" texturas o porciones de ellas de manera sencilla, aplicando efectos como espejados, alphablending o rotacion en una sola llamada.

Vamos, yo no se los demas, pero yo a la hora de programar suelo buscar las cosas mas sencillas de implementar y que me den buen resultado.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.