1

我正在绘制一个带有纹理的多边形,作为我的 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;
}
}
4

3 回答 3

2

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

另外,您的图像中是否有 Alpha 通道?

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

  1. 您需要制作具有 alpha 透明度的图像。在此处查找GIMP教程或在此处查找Photoshop教程。
  2. 现在加载指示正确图像格式的纹理。互联网上有很多关于“opengl alpha blending”的教程——这里有一个 C++ 和 SDL 视频教程。

希望这可以帮助!

于 2012-12-10T22:15:52.570 回答
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 在评论中纠正了我,但您的应用程序必须支持这一点)如果您的图像编辑器不支持带 alpha 的 BMP,您应该尝试以下格式之一:

  • PNG
  • TIFF(最近的变化)
  • 塔尔加
于 2012-12-10T22:16:59.543 回答
0

要使用透明通道(alpha 通道),您需要使用该通道生成 BMP 文件(如果您要求,Photoshop 会这样做),并在生成 mipmap 并将图像发送到视频卡时指定正确的格式。

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

于 2012-12-10T22:15:19.030 回答