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






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.