Domanda

Sto cercando un modo per rimuovere lo sfondo di una bitmap a 24 bit, mantenendo l'immagine principale totalmente opaca, fino ad ora la fusione ha servito allo scopo, ma ora devo mantenere il bit principale opaco. Ho cercato su Google ma non ho trovato nulla di utile, penso che probabilmente sto cercando termini sbagliati, quindi qualsiasi aiuto sarebbe molto apprezzato.

Modifica: Sì scusa, sto usando il nero adesso come sfondo.

È stato utile?

Soluzione

Quando crei la trama per OpenGL, ti consigliamo di creare la trama come trama RGBA a 32 bit. Crea un buffer per contenere i contenuti di questa nuova texture a 32 bit e scorrere attraverso la bitmap a 24 bit. Ogni volta che ti imbatti nel colore di sfondo, imposta l'alfa a zero nella nuova bitmap a 32 bit.

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;
}

Altri suggerimenti

Dovrai caricare le tue trame con il formato GL_RGBA nella tua chiamata a glTexImage2D. Se lo hai fatto, devi solo abilitare la fusione:

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

Sembra un po 'confuso. L'immagine a 24 bit non ha trasparenza, è semplicemente una matrice di valori RGB. Cosa intendi con "mantenendo opaco il bit principale"? Vuoi avere tutti i pixel con un certo colore - ad esempio tutti i pixel neri - trasparenti? Se questo è ciò che desideri, puoi google maschera di trasparenza aperta ( vedi NeHe # 20 per esempio).

Ciò di cui hai veramente bisogno è un canale alfa nell'immagine. Poiché è a 24 bit, non ne hai uno, ma puoi crearne uno al volo mentre carichi l'immagine semplicemente impostando l'alfa su zero per ogni pixel nero (0x000000)

Mi sembra che tu stia cercando lo Stencil Buffer, che viene utilizzato proprio per questo tipo di attività di limitazione dell'area di disegno.

Il buffer memorizza un valore associato a ciascun pixel, dove verrà visualizzato 1 disegno successivo e dove è 0 verrà mascherato. Solitamente i buffer di stencil vengono utilizzati con tecniche di rendering multipass per creare elementi come i riflessi e gli schermi a testa in alto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top