我正在绘制一个带有纹理的多边形,作为我的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;
}
}
答案 0 :(得分:2)
我的代码中没有看到glEnable(GL_BLEND)或glBlendFunc。你在做这个吗?
此外,您的图片中是否有Alpha通道?
编辑:您正在使用格式GL_RGB加载纹理,您告诉OpenGL此纹理上没有alpha。
答案 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:
答案 2 :(得分:0)
要使用透明度通道(Alpha通道),您需要使用此通道生成BMP文件(如果您要求,Photoshop会执行此操作),并在生成mipmap并将图像发送到视频时指定正确的格式卡。
这样,图像将具有所需的透明度信息,OpenGl驱动程序将知道图像具有此信息。