1

画像をロードした後、各チャネルの個々のバイトを符号なし文字の配列にロードしました。これは、クワッドにテクスチャとして投影する関数に渡されます。背景色として表示されるアルファ チャネル以外はすべて正常に動作しているようです。OpenGL を使用して画像を描画しています。階層化メカニズムを追加することでメリットはありますか? また、希望する透明効果を得るにはどうすればよいですか?

注:これは、変更が必要だと感じているコードです。

void SetUpView()
{
    // Set color and depth clear value
    glClearDepth(1.f);
    glClearColor(1.f, 0.f, 0.f, 0.f);

    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glDepthMask(GL_TRUE);

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

    // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
};

また、クワッドをレンダリングするコードは次のとおりです。

void DrawTexturedRect(RectBounds *Verts, Image *Texture)
{
    glBindTexture(GL_TEXTURE_2D, GetTextureID(Texture));

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelZoom(1, -1);

    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 1.0);
    glVertex3f(Verts->corners[0].x, Verts->corners[0].y, Verts->corners[0].z);

    glTexCoord2f(1.0, 1.0);
    glVertex3f(Verts->corners[1].x, Verts->corners[1].y, Verts->corners[1].z);

    glTexCoord2f(1.0, 0.0);
    glVertex3f(Verts->corners[2].x, Verts->corners[2].y, Verts->corners[2].z);

    glTexCoord2f(0.0, 0.0);
    glVertex3f(Verts->corners[3].x, Verts->corners[3].y, Verts->corners[3].z);
    glEnd();
};

Image クラスは、OpenIL を使用して取得した符号なし文字の配列を保持します。

関連コード:

loaded = ilLoadImage(filename.c_str());
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);

unsigned char *bytes = ilGetData();

//NewImage is an instance of an Image. This is returned and passed to the above function.
NewImage->data = bytes;

問題

4

3 に答える 3

2

透明なものを描画する前に、次を呼び出す必要があります。

glDepthMask(false);

そしてその後:

glDepthMask(true);

また、すべての透明オブジェクトは、すべての不透明オブジェクトの後に描画する必要があります。

于 2011-03-15T23:11:00.380 に答える
0

glClearColor(1.f, 0.f, 0.f, 0.f);

それは RGBA のデフォルトで、赤を 1.0 に設定していると思います。

あなたが達成しようとしていることのより良い説明はどうですか?

于 2010-06-23T21:26:02.400 に答える
0

試す:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

編集:それがどのように見えるか知っています。カーソルの後ろに青い正方形 (カーソルの後ろに Z オーダーの位置がある) を描いているように見えます。アルファ ブレンディングを行うときは、前後の正しい Z オーダーで物事を描画する必要があります。そうしないと、見ているようなエラーが表示されます。

于 2010-06-23T21:26:43.643 に答える