Pregunta

Estoy buscando una manera de eliminar el fondo de un mapa de bits de 24 bits, manteniendo la imagen principal totalmente opaca, hasta ahora la combinación ha servido para esto, pero ahora necesito mantener el bit principal opaco. He buscado en Google pero no he encontrado nada útil, creo que probablemente estoy buscando los términos incorrectos, por lo que cualquier ayuda sería muy apreciada.

Editar: Sí, lo siento, estoy usando negro ahora como fondo.

¿Fue útil?

Solución

Cuando esté creando la textura para OpenGL, querrá crear la textura como una textura RGBA de 32 bits. Cree un búfer para mantener el contenido de esta nueva textura de 32 bits e itere a través de su mapa de bits de 24 bits. Cada vez que encuentre su color de fondo, establezca el alfa en cero en su nuevo mapa de bits de 32 bits.

struct Color32;
struct Color24;

void Load24BitTexture(Color24* ipTex24, int width, int height)
{
   Color32* lpTex32 = new Color32[width*height];

   for(x = 0; x < width; x++)
   {
      for(y = 0; y < height; y++)
      {
         int index = y*width+x;
         lpTex32[index].r = ipTex24[index].r;
         lpTex32[index].g = ipTex24[index].g;
         lpTex32[index].b = ipTex24[index].b;

         if( ipTex24[index] == BackgroundColor)
            lpTex32[index].a = 0;
         else
            lpTex32[index].a = 255;
      }
   }

   glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, lpTex32);

   delete [] lpTex32;
}

Otros consejos

Deberá cargar sus texturas con el formato GL_RGBA en su llamada a glTexImage2D. Si ha hecho esto, entonces solo necesita habilitar la mezcla:

    /* Set up blend */
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Esto suena un poco confuso. La imagen de 24 bits no tiene transparencia, es simplemente una matriz de valores RGB. ¿Qué quiere decir con "mantener el bit principal opaco"? ¿Desea tener todos los píxeles con cierto color, por ejemplo, todos los píxeles negros, transparentes? Si esto es lo que desea, puede google máscara de transparencia opengl ( ver NeHe # 20 por ejemplo).

Lo que realmente necesitas es un canal alfa en tu imagen. Como tiene 24 bits, no tiene uno, pero puede crear uno sobre la marcha mientras carga la imagen simplemente configurando el alfa en cero para cada píxel negro (0x000000)

Me suena como si estuvieras buscando el búfer de plantilla, que se usa solo para este tipo de tarea de restringir el área de dibujo.

El búfer almacena un valor asociado a cada píxel, donde se renderizará 1 dibujo subsiguiente y donde está 0 se enmascarará. Por lo general, los buffers de plantilla se usan con técnicas de representación de múltiples pasos para crear elementos como reflejos y pantallas de visualización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top