我正在寻找一种方法来删除 24 位位图的背景,同时保持主图像完全不透明,到目前为止,混合已经达到了目的,但现在我需要保持主图像不透明。我在谷歌上搜索过,但没有发现任何有用的东西,我想我可能搜索了错误的术语,所以任何帮助将不胜感激。

编辑:是的,抱歉,我现在使用黑色作为背景。

有帮助吗?

解决方案

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

其他提示

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top