C++ 如何在OpenGL中从纹理中删除黑色背景

C++ 如何在OpenGL中从纹理中删除黑色背景,c++,c,opengl,alpha,blending,C++,C,Opengl,Alpha,Blending,我正在寻找一种方法来删除24位位图的背景,同时保持主图像完全不透明,直到现在混合已经达到了目的,但现在我需要保持主位不透明。我在谷歌上搜索过,但没有发现任何有用的东西,我想我可能是在搜索错误的词,所以任何帮助都将不胜感激 编辑: 是的,对不起,我现在使用黑色作为背景。听起来像是您在寻找模具缓冲区,它用于限制绘图区域的这类任务 缓冲区存储与每个像素关联的值,其中1个后续图形将被渲染,0个将被屏蔽。通常,模具缓冲区与多通道渲染技术一起使用,以创建反射和平视显示等内容。这听起来有点混乱。24位图像没有

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

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

听起来像是您在寻找模具缓冲区,它用于限制绘图区域的这类任务


缓冲区存储与每个像素关联的值,其中1个后续图形将被渲染,0个将被屏蔽。通常,模具缓冲区与多通道渲染技术一起使用,以创建反射和平视显示等内容。

这听起来有点混乱。24位图像没有透明度,它只是一个RGB值数组。“保持主位不透明”是什么意思?是否希望所有具有特定颜色的像素(例如所有黑色像素)都是透明的?如果这是您想要的,您可以使用谷歌搜索(参见示例)。

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

您将需要在调用glTexImage2D时加载具有GL_RGBA格式的纹理。 如果已执行此操作,则只需启用“混合”:

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

在为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;
}
structcolor32;
结构颜色24;
无效载荷24BitTexture(颜色24*ipTex24,内部宽度,内部高度)
{
Color32*lpTex32=新Color32[宽度*高度];
对于(x=0;x
我假设您所说的背景是指定的颜色,例如黑色:R0G0B0?我说我最初使用混合函数去除黑色,但它给我留下了一个半透明的中心图像,而不是不透明的。我过去使用过透明遮罩,但我有很多问题,不喜欢每张图片都需要另一个文件。啊哈,我想我现在明白了。如果你有足够的内存,就像其他人指出的那样,只需在图像中使用alpha通道。如果他有足够的内存可以燃烧,这可能是最简单的解决方案。如果不是的话,在索引透明度上花费整个8位alpha通道将是一种浪费。太棒了,这正是我想要的。我不太确定如何在OGL中读取alpha通道,在谷歌搜索并阅读了您的代码之后,我想我已经整理好了,可以开始了。谢谢:)我完全误解了这个问题,但有一个~需要启用blend,所以我不会删除我的答案。