dividir una imagen en varias texturas

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

dividir una imagen en varias texturas

Notapor baigos » Mar Oct 19, 2010 5:30 pm

La cuestion es esta, como podria hacer para cargar una imagen rectangular -cuyo tamaño no es potencia de 2- y dividirla a varias texturas cuyas dimensiones son potencia de 2.
Busco algun ejemplo, source, o documentacion que explique como hacerlo en opengl, aunque la verdadera intención es utilizar la api powervr de dreamcast.
El sitio de videojuegos del nordeste argentino:
www.arcadenea.com.ar
baigos
 
Mensajes: 27
Registrado: Dom Oct 03, 2010 5:51 am

Re: dividir una imagen en varias texturas

Notapor Juanxo » Mar Oct 19, 2010 8:46 pm

buenas baigos:

el problema que le veo a lo que propones es que una potencia es, una serie de multiplicaciones, por lo que básicamente para que al dividir te quede algo que sea potencia de 2, ha de ser potencia de 2 originalmente. Además de que estarías aumentando el número de texturas necesarias por modelo, así como tener que subdividir aún más las mallas3d, ya que habitualmente cada una utiliza un conjunto de material/textura.

Yo creo que la solución que se suele emplear en estos casos es utilizar una textura que su tamaño si sea potencia de 2, centrando la textura anterior en la nueva. Gastas algo de memoria de video, pero es más simple. Otra forma, sobre todo si tienes muchas de estas texturas, es utilizar texture atlas (atlas de texturas).

Un saludo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: dividir una imagen en varias texturas

Notapor Geo » Mié Oct 20, 2010 12:04 am

No lo he hecho y por tanto no puedo ayudar con código para generar las texturas, pero si que se puede hacer la separación de una cantidad par en sus potencias de dos, por ejemplo podrías descomponer la textura en muchas texturas de 2x2 ;).

Con este programa podrías encontrar las potencias de dos que componen un número par, después sería la generación de las subtexturas, aunque no se hasta qué punto podrías estar aumentando el número de texturas porque, como dije, no lo he hecho.

Código: Seleccionar todo
#include <cstdio>
#include <cstdlib>
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

bool es_par( int n );
bool es_potencia_de_2( int n );
int potencia_mas_cercana( int n );

int main( int argc, char* argv[] ) {
    if ( argc < 2 ) {
        cout << "Uso: " << endl;
        cout << "potencia2 [PARAM]" << endl << endl;
        cout << "[PARAM] debe ser un número positivo par" << endl;
        exit( 1 );
    }

    int param = atoi( argv[ 1 ] );

    if ( ( param <= 0 ) ) {
        cout << "Error: el parámetro debe ser mayor que 0." << endl;
    }

    if ( !es_par( param ) ) {
        cout << "Error: el parámetro debe ser par." << endl;
        exit( 1 );
    }

    if ( !es_potencia_de_2( param ) ) {
        cout << "El número " << param << " NO es potencia de 2," << endl
            << "se expresará en una suma de potencias de 2: ";
        int copia = param;
        while( copia > 2 && copia >= 0 ) {
            int cercana = potencia_mas_cercana( copia );
            cout << cercana << " + ";
            copia = copia - cercana;
        }
        cout << copia << endl;
    }
    else
        cout << "El número " << param << " SI es potencia de 2." << endl;

    return 0;
}

bool es_par( int n ) {
    return ( n % 2 == 0 ) ? true : false;
}

bool es_potencia_de_2( int n ) {
    int temp = 2;
   
    while( temp < n ) {
        temp = temp * 2;
    }
    if ( temp == n ) return true;
    else return false;
}

int potencia_mas_cercana( int n ) {
    while ( !es_potencia_de_2( n ) ) {
        n = n - 2;
    }
   
    return n;
}
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Re: dividir una imagen en varias texturas

Notapor baigos » Mié Oct 20, 2010 12:56 am

acabo de enterarme de que pueden ser texturas rectangulares -potencia de 2 por supuesto-, asi que mejor jor. Muy buenas ideas, encontré algo de código en el source del supertux para manejar texturas potencia de 2 y esas cosas, asi que me viene muy bien las respuestas. Gracias che.
El sitio de videojuegos del nordeste argentino:
www.arcadenea.com.ar
baigos
 
Mensajes: 27
Registrado: Dom Oct 03, 2010 5:51 am


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado