Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





[OpenGL + SDL] PNG de Textura con transparencias... ?

Iniciado por kittie4man, 16 de Abril de 2008, 08:18:16 PM

« anterior - próximo »

kittie4man

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

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.
Por un stratos menos tenso

kittie4man

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

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.

kittie4man

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

tamat

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 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.
Por un stratos menos tenso