Como remover fundo preto de texturas em OpenGL
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.
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 imagemParece-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.