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() でアルファを減らすと、白いボックスだけではなく画像全体がフェードします。
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 が表示されませ。あなたはこれをやっていますか?

また、画像にアルファチャンネルはありますか?

編集: GL_RGB 形式でテクスチャをロードしています。OpenGL に、このテクスチャにアルファがないことを伝えています。

  1. アルファ透明度のある画像を作成する必要があります。GIMPのチュートリアルについてはこちらを、Photoshopのチュートリアルについてはこちらをご覧ください。
  2. 正しい画像フォーマットを示すテクスチャをロードします。インターネット上には「opengl アルファ ブレンディング」のチュートリアルがたくさんあります。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());

アルファ チャネルを許可し、ブレンドをオンにするには:

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

更新
私の知る限り、BMP は透明度をサポートしていません(できます。 ananthonline がコメントで私を修正しましたが、アプリケーションはこれをサポートする必要があります) imag エディターがアルファ付きの BMP をサポートしていない場合は、次のいずれかの形式を試してください。

  • PNG
  • TIFF (最近のバリエーション)
  • タルガ
于 2012-12-10T22:16:59.543 に答える
0

透明度チャネル (アルファ チャネル) を使用するには、このチャネルを使用して BMP ファイルを生成し (Photoshop が要求すると、これを行います)、ミップマップを生成して画像をビデオ カードに送信するときに正しい形式を指定する必要があります。

このようにして、画像には必要な透明度情報が含まれ、OpenGl ドライバーは画像にこの情報があることを認識します。

于 2012-12-10T22:15:19.030 に答える