Pergunta

Eu estou procurando uma maneira de remover o fundo de um bitmap de 24 bits, mantendo a imagem principal totalmente opaco, até agora misturando serviu ao propósito, mas agora eu preciso para manter o opaco bit principal. Eu procurei no Google, mas não encontrou nada útil, eu acho que provavelmente estou procurando os termos errados, porém, por isso qualquer ajuda seria muito apreciada.

Edit: Sim desculpe, eu estou usando direita negro agora como pano de fundo.

Foi útil?

Solução

Quando você está criando a textura para OpenGL, você vai querer criar a textura como um RGBA textura de 32 bits. Criar um buffer para armazenar o conteúdo desta nova textura de 32 bits e iterate através de seu bitmap de 24 bits. Toda vez que você se deparar com a sua cor de fundo, definir o alfa para zero em seu bitmap novo 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;
}

Outras dicas

Você vai precisar carregar suas texturas com formato GL_RGBA em sua chamada para glTexImage2D. Se você tiver feito isso, então você só precisa permitir mistura:

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

Isto soa um pouco confuso. imagem de 24 bits não tem transparência, é simplesmente uma matriz de valores RGB. O que você quer dizer com “manter o opaco bit principal”? Você quer ter todos os pixels com determinada cor - por exemplo, todos os pixels pretos - transparente? Se é isso que você quer, você pode google opengl transparência mascarar ( veja a NeHe # 20 por exemplo).

O que você realmente precisa é de um canal alfa em sua imagem. Uma vez que é de 24 bits, você não tem um, mas simplesmente definindo o alfa para zero para todos os preto (0x000000) pixels

você poderia criar um on the fly como você carregar a imagem

Parece-me que você está procurando o stencil buffer, que é usado apenas para este tipo de tarefa de restringir a área de desenho.

As lojas tampão um valor associado a cada pixels, onde é um desenho posterior serão prestados e onde é 0 será mascarados. Normalmente buffers de estêncil são usadas com técnicas de renderização multipass para criar coisas como reflexões e heads-up é exibido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top