Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Texturas De Opengl Con Sdl

Iniciado por Pogacha, 26 de Agosto de 2005, 05:00:03 PM

« anterior - próximo »

Pogacha

 No he instalado el SDL pero lo he mirado mucho, sus infos y ayudas, como tambien el codigo ... no encontre una función que convierta una surface en una textura ... no se por que no hay! ... esta escondida? requiero de otra libreria externa?

Como hago para crear una textura en OpenGL, no hay ninguna función para crearla ? debo hacerlo a pelo desde una Surface de  SDL ? o que se acostumbra?

Saludos.

LC0

 Por lo que yo se, puedes acceder perféctamente a los píxeles almacenados en el buffer de un surface.  Eso sí, tienes que conocer de antemano los datos de la profundidad de color, orden de los bits, y si lleva canal alpha la imagen o no.

De todas formas yo te recomiendo la biblioteca (que no librería ;)) DeVIL. Llevan bastante tiempo sin sacar una nueva versión, pero su manejko es muy parecido al de OpenGL y, de hecho, está pensada para integrar la carga de bitmaps para este API.
Saludos.

Ray

 No creo que te sea muy complicado crear tu propia función que cargue texturas opengl a partir de surfaces, y aprovechar para incluir en ella las caracteristicas de la textura como el tipo de filtrado, mipmaps, etc. Quizas el unico inconveniente esta en los formatos diferentes, y debas usar SDL_ConvertSurface.

visualcubb

 Hola Pogacha, cargar texturas con SDL es muy fácil, solo tienes que bajar una librería que se llama SDL_image ( http://www.libsdl.org/projects/SDL_image/ ), uncluir el .h y . lib en tu proyecto y después usar el siguiente código:


Estas variables deben ser globales (o privadas dentro de una clase si estás usando POO).

SDL_RWops *rwop;  //variable de SDL_imagen
SDL_Surface *image; //variable de SDL_imagen
GLuint texture; //identificador de textura de OpenGL


Después usas el siguiente código para saber si existe el archivo, considera que BUFF contiene el nombre del archivo:

rwop=SDL_RWFromFile(BUFF, "rb");
if(rwop) image=IMG_LoadPNG_RW(rwop);
else
{
  printf("No existe el archivo");
}


//Verificas que la textura se haya podido guardar bien y si es así, cargas en Memoria:

if(image)
{
 
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
   glGenTextures(1,&texture );
   glBindTexture(GL_TEXTURE_2D, texture);

/**************************************/
// Aquí verificas si tiene o no alpha channel
//
/**************************************/
   if(image->format->Amask)
   {
    gluBuild2DMipmaps(GL_TEXTURE_2D,
    GL_RGBA,image->w, image->h,
    GL_RGBA, GL_UNSIGNED_BYTE,image->pixels);
    }
    else
   {
   gluBuild2DMipmaps(GL_TEXTURE_2D,
   GL_RGB,image->w, image->h,
   GL_RGB, GL_UNSIGNED_BYTE,image->pixels);
  }

//Colocas el filtro correspondiente
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);


// Y finalmente creas la imágen en OpenGL.
if(image->format->Amask)
{
 glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,image->w,
 image->h,0,GL_RGBA,GL_UNSIGNED_BYTE,image->pixels);
}
else
{
 glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,image->w,
 image->h,0,GL_RGB,GL_UNSIGNED_BYTE,image->pixels);
}

}

}


Después para usarla solo tienes que llamar a glBindTexture(GL_TEXTURE_2D, texture); antes de dibujar tu modelo y listo.


Saludos.
quot;Y conocereis la verdad y la verdad os hara libres" Juan 8:32.

http://www.openglubb.info/

visualcubb

 Se me olvidaba, IMG_LoadPNG_RW(rwop); carga PNG, si quieres que cargue otro tipo de textura simplemente cambiale PNG por BMP, TGA, JPG o lo que necesites, si tienes dudas revisa la documentación.
quot;Y conocereis la verdad y la verdad os hara libres" Juan 8:32.

http://www.openglubb.info/

Pogacha

 Luego de leerme todo y no encontrar la funcion, supuse que no existia, pero me parecio raro que no la tenga ... o sea ... es casí obvio que si vas a dar soporte a OpenGL deberias facilitar el juego de funciones basicas.

O sea ... deberia proponer que existan:
#define SDL_GL_MIPMAPS               0x0001
#define SDL_GL_MINFILTERLINEAR 0x0002
#define SDL_GL_MAXFILTERLINEAR 0x0004
#define SDL_GL_TODOLOOTRO       0xXXXX

bool SDL_GLGenTexture1d(SDL_Surface *s, int Caracteristicas, int &TexturaId);
bool SDL_GLGenTexture2d(SDL_Surface *s, int Caracteristicas, int &TexturaId);
bool SDL_GLGenTextureCubeMap(SDL_Surface *s[6], int Caracteristicas, int &TexturaId);

Pero supongo que es algo con la filosofia de OpenGL ...
Gracias a todos.
Saludos.

visualcubb

Cita de: "Pogacha"Luego de leerme todo y no encontrar la funcion, supuse que no existia, pero me parecio raro que no la tenga ... o sea ... es casí obvio que si vas a dar soporte a OpenGL deberias facilitar el juego de funciones basicas.

O sea ... deberia proponer que existan:
#define SDL_GL_MIPMAPS               0x0001
#define SDL_GL_MINFILTERLINEAR 0x0002
#define SDL_GL_MAXFILTERLINEAR 0x0004
#define SDL_GL_TODOLOOTRO       0xXXXX

bool SDL_GLGenTexture1d(SDL_Surface *s, int Caracteristicas, int &TexturaId);
bool SDL_GLGenTexture2d(SDL_Surface *s, int Caracteristicas, int &TexturaId);
bool SDL_GLGenTextureCubeMap(SDL_Surface *s[6], int Caracteristicas, int &TexturaId);

Pero supongo que es algo con la filosofia de OpenGL ...
Gracias a todos.
Saludos.
No entiendo... ¿no te sirvió el código que te puse antes?... a mi me funciona.

Saludos.
quot;Y conocereis la verdad y la verdad os hara libres" Juan 8:32.

http://www.openglubb.info/

Pogacha

 No el codigo, aun que lo probe debe andar, muchas gracias, mi exclamación era por que SDL no tuviera estas funciones, lo cual me parecia raro, entonces pregunté. En realidad el thread deberia ser: Hay funciones del SDL que generen la textura automaticamente?

Gracias de nuevo.
Saludos.

vicho

 SDL no tiene esas funciones ya que la generacion de texturas son cosas de 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.