HOla a todos!!
Estoy teniendo problemas con opengl+sdl (entre otros) con las texturas.
Estoy recién empezando con opengl+sdl y quiero poner un PNG como textura.
Ahora bien, ese PNG tiene una imagen y el resto es transparencia (según GIMP).
Cuando cargo la textura se me ve lo que seria la transparencia como un color.
Acá van los pedazos de código:
Inicio OpenGL + SDL:
glViewport( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
glEnable( GL_TEXTURE_2D );
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
Carga de la textura:
GLuint loadTexture_gl(SDL_Surface *surface){
GLuint texture;
GLint nOfColors;
GLenum texture_format;
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4)
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
} else if (nOfColors == 3)
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
} else {
printf("warning: the image is not truecolor.. this will probably break\n");
}
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0, texture_format, GL_UNSIGNED_BYTE, surface->pixels );
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
return texture;
}
Objecto y aplicado de textura:
glBindTexture( GL_TEXTURE_2D, sTexture1 );
glBegin( GL_QUADS );
glTexCoord2i( 0, 0 );
glVertex3f( 100, 100, 0 );
// Bottom-left vertex (corner)
glTexCoord2i( 1, 0 );
glVertex3f( 228, 100, 0 );
// Bottom-right vertex (corner)
glTexCoord2i( 1, 1 );
glVertex3f( 228, 228, 0 );
// Top-right vertex (corner)
glTexCoord2i( 0, 1 );
glVertex3f( 100, 228, 0 );
glEnd();
Para muchos es una pregunta estúpida pero la estoy haciendo después de buscar por todos lados tutoriales/manuales/documentos o lo que sea acerca de OpenGL con SDL y no encontrar, y después de probar muchas cosas de otros tutoriales de opengl (como los de nehe) y no terminar de entender todo..
Si alguien tiene para darme algún manual interesante/completo sobre estas 2 librerias en conjunto o de opengl explicado a fondo se lo voy a agradecer mucho y no molestaría más con mis preguntas.
Salu2 y gracias desde ya.
Juan Pablo
Tienes que activar el blend:
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
Lo segundo es para decirle como quieres usar el alpha.
Cita de: "tamat"Tienes que activar el blend:
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
Lo segundo es para decirle como quieres usar el alpha.
Tamat, ante todo muchas gracias por la respuesta.
Te comento que ya habia probado de agregar esas 2 lineas y me ocasiono que el objeto creado con la textura no se viera.
Osea, cuando a la inicializacion del OpenGL le agrego:
glEnable( GL_BLEND );
desaparece el objeto creado con el siguiente codigo.
glBindTexture( GL_TEXTURE_2D, sTexture1 );
glBegin( GL_QUADS );
glTexCoord2i( 0, 0 );
glVertex3f( 100, 100, 0 );
// Bottom-left vertex (corner)
glTexCoord2i( 1, 0 );
glVertex3f( 228, 100, 0 );
// Bottom-right vertex (corner)
glTexCoord2i( 1, 1 );
glVertex3f( 228, 228, 0 );
// Top-right vertex (corner)
glTexCoord2i( 0, 1 );
glVertex3f( 100, 228, 0 );
glEnd();
Si le saco el glEnable( GL_BLEND ); el objeto creado se vuelve a ver normalmente.
La otra linea no me da problema.
Lei en otro topic de este foro que hacia falta agregar:
glEnable(GL_DEPTH_TEST);
Cuando lo agrego la aplicacion flashea borrando y mostrando los graficos de una forma notoria. Osea, si el grafico se mueve rapido y constante lo llego a ver, sino esta desaparecido.
Si activo los 2 juntos (blend y depth_test) directamente no se ve nada.
Creo que estoy teniendo problemas con la carga de texturas o la forma en la que se crea, aplica textura y muestra un objeto.
Necesitaria si alguien conoce un buen manual/tutorial de OpenGL (en lo posible en español).
Salu2 y gracias.
Juan Pablo
Ahora mismo no lo puedo probar, pero cuando configuras el material que tenga alpha hay un "glAlphaFunc" que puede afectar a lo que comentas.
Quizás el objeto desaparezca por completo por algo relacionado. No creo pero si tienes prisa por solucionarlo, mira a ver :) por google glAlphaFunc
Un saludo.
Cita de: "Prompt"Ahora mismo no lo puedo probar, pero cuando configuras el material que tenga alpha hay un "glAlphaFunc" que puede afectar a lo que comentas.
Quizás el objeto desaparezca por completo por algo relacionado. No creo pero si tienes prisa por solucionarlo, mira a ver :) por google glAlphaFunc
Un saludo.
Prompt, Gracias por la respuesta.
No tengo apuro por solucionarlo, solo es que estoy empezando a incursionar en SDL+OpenGL y me "trabe" con esto que me parece bastante elemental.
Recien hice unas pruebas mas y me funciono la transparencia con una imagen en particular. Voy a revolver un poco mas las 2 pruebas así identifico el error.
Salu2 y gracias.
Juan Pablo
lo de que el objeto solo se ve al moverse es porque si activas el depth_test tienes que borrar el Depth buffer al principio de cada frame y algo me dice que no lo haces.
Mi consejo es que te cojas los tutoriales de Nehe (http://nehe.gamedev.net/) y te los mires uno a uno ya que me da la impresion de que estas tanteando opengl y eso es un mal método, si no entiendes lo que hace openGL con cada llamada dificilmente conseguiras los resultados que esperas.