如何从OpenGL中的纹理中删除黑色背景

时间:2009-06-16 19:25:52

标签: c++ c opengl alpha blending

我正在寻找一种方法来删除24位位图的背景,同时保持主图像完全不透明,直到现在混合已经达到目的但现在我需要保持主位不透明。我在Google上搜索过但发现没有任何帮助,我想我可能会搜索错误的条款,所以任何帮助都会非常感激。

编辑: 对不起,我现在正在使用黑色作为背景。

5 个答案:

答案 0 :(得分:8)

在为OpenGL创建纹理时,您需要将纹理创建为32位RGBA纹理。创建一个缓冲区来保存这个新的32位纹理的内容并迭代你的24位位图。每次遇到背景颜色时,在新的32位位图中将alpha设置为零。

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

答案 1 :(得分:2)

您需要在调用glTexImage2D时使用GL_RGBA格式加载纹理。 如果你已经这样做了,那么你只需要启用混合:

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

答案 2 :(得分:0)

这听起来有点令人困惑。 24位图像没有透明度,它只是一个RGB值数组。 “保持主要位不透明”是什么意思?您想让所有具有特定颜色的像素(例如所有黑色像素)都透明吗?如果这是你想要的,你可以谷歌opengl transparency mask(例如参见NeHe #20)。

答案 3 :(得分:0)

您真正需要的是图片中的Alpha通道。由于它是24位,你没有,但你可以在加载图像时动态创建一个,只需将每个黑色(0x000000)像素的alpha设置为零

答案 4 :(得分:-1)

听起来像你正在寻找模板缓冲区,它只用于限制绘图区域的这类任务。

缓冲区存储与每个像素相关联的值,其中将呈现1个后续绘图,并且在0处将屏蔽它。通常,模板缓冲区与多通道渲染技术一起使用,以创建反射和抬头显示等内容。