Opengl纹理透明度.BMP

时间:2012-12-10 21:55:58

标签: opengl transparency textures

我正在绘制一个带有纹理的多边形,作为我的OpenGL程序中HUD的一部分。

//Change the projection so that it is suitable for drawing HUD
glMatrixMode(GL_PROJECTION);  //Change the projection
glLoadIdentity();
glOrtho(0, 800, 800, 0, -1, 1);  //2D Mode
glMatrixMode(GL_MODELVIEW);  //Back to modeling
glLoadIdentity();

//Draw the polygon with the texture on it
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 1.0); glVertex3f(250.0, 680, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(570.0, 680, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(570.0, 800, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(250.0, 800, 0.0);
glEnd();

//Change the projection back to how it was before
glMatrixMode(GL_PROJECTION);  //Change the projection
glLoadIdentity();
gluPerspective(45.0, ((GLfloat)800) / GLfloat(800), 1.0, 200.0);  //3D Mode
glMatrixMode(GL_MODELVIEW);  //Back to modeling
glLoadIdentity();

问题在于我无法获得"框"在图像周围与背景融为一体。我在Photoshop中打开了图像(.bmp)并删除了我想要显示的图像周围的像素,但它仍然绘制了整个矩形图像。它用我用glColor3f()的最后一种颜色删除了我删除的像素,我可以让整个图像变得透明,但我只希望我在Photoshop中删除的像素是透明的。 有什么建议吗?

我用于纹理的属性:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, TextureList[i]->getSizeX(), TextureList[i]->getSizeY(), GL_RGB, GL_UNSIGNED_BYTE, TextureList[i]->getData());

这是我的计划的图像。我试图让白盒子消失,但是当我用glColor4f()减少alpha时,整个图像会淡化而不仅仅是白盒子。
img607.imageshack.us/img607/51/ogly.png

从文件加载纹理的代码:

texture::texture(string filename)
{
// Routine to read a bitmap file.
// Works only for uncompressed bmp files of 24-bit color.
// Both width and height must be powers of 2.
unsigned int size, offset, headerSize;

// Read input file name.
ifstream infile(filename.c_str(), ios::binary);

// Get the starting point of the image data.
infile.seekg(10);
infile.read((char *) &offset, 4);

// Get the header size of the bitmap.
infile.read((char *) &headerSize,4);

// Get width and height values in the bitmap header.
infile.seekg(18);
infile.read( (char *) &sizeX, 4);
infile.read( (char *) &sizeY, 4);

// Allocate buffer for the image.
size = sizeX * sizeY * 24;
data = new unsigned char[size];

// Read bitmap data.
infile.seekg(offset);
infile.read((char *) data , size);

// Reverse color from bgr to rgb.
int temp;
for (unsigned int i = 0; i < size; i += 3)
{ 
temp = data[i];
data[i] = data[i+2];
data[i+2] = temp;
}
}

3 个答案:

答案 0 :(得分:2)

我的代码中没有看到glEnable(GL_BLEND)或glBlendFunc。你在做这个吗?

此外,您的图片中是否有Alpha通道?

编辑:您正在使用格式GL_RGB加载纹理,您告诉OpenGL此纹理上没有alpha。

  1. 您需要制作具有Alpha透明度的图像。在这里查看GIMP教程,或在此处查看Photoshop教程。
  2. 现在加载指示正确图像格式的纹理。互联网上有很多关于“opengl alpha混合”的教程 - here是一个C ++和SDL视频教程。
  3. 希望这有帮助!

答案 1 :(得分:1)

如果我理解正确,你需要透明度来处理纹理,是吗? 如果是,请更改

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, TextureList[i]->getSizeX(), TextureList[i]->getSizeY(), GL_RGB, GL_UNSIGNED_BYTE, TextureList[i]->getData());

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, TextureList[i]->getSizeX(), TextureList[i]->getSizeY(), GL_RGBA, GL_UNSIGNED_BYTE, TextureList[i]->getData());

要允许Alpha通道,请启用以下符号:

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

<强>更新
据我所知, BMP不支持透明度(他们可以,ananthonline在评论中纠正了我,但你的应用程序必须支持这个)如果你的imag编辑器你应该尝试以下格式之一不支持带alpha的BMP:

  • PNG
  • TIFF(最近变化)
  • TARGA

答案 2 :(得分:0)

要使用透明度通道(Alpha通道),您需要使用此通道生成BMP文件(如果您要求,Photoshop会执行此操作),并在生成mipmap并将图像发送到视频时指定正确的格式卡。

这样,图像将具有所需的透明度信息,OpenGl驱动程序将知道图像具有此信息。