5

私はこれをGoogleで調べようとしましたが、首尾一貫した単純な答えはないようです。これは単純ではないためですか、それとも正しいキーワードを使用していないためですか?

それにもかかわらず、これは私がこれまでに成し遂げた進歩です。

  1. 2つの正方形を形成するために8つの頂点を作成しました。
  2. 200ビットのアルファ値を持つテクスチャを作成しました(つまり、約80%透明)。
  3. 正しく表示される各正方形に同じテクスチャを割り当てました。
  4. アルファが255のテクスチャを使用すると、明るく見えることに気づきました。

initは次のようなものです。

glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

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

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, textureIds);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

int i, j;
GLubyte pixel;
for (i = 0; i < TEXTURE_HEIGHT; i++)
{
    for (j = 0; j < TEXTURE_WIDTH; j++)
    {
        pixel = ((((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255);
        texture[i][j][0] = pixel;
        texture[i][j][1] = pixel;
        texture[i][j][2] = pixel;
        texture[i][j][3] = 200;
    }
}

glBindTexture(GL_TEXTURE_2D, textureIds[0]);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    TEXTURE_WIDTH, TEXTURE_HEIGHT,
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture);

これは、本の417ページのOpenGLプログラミングガイドのコードスニペットにいくぶん似ており、チェックパターンを作成します。

そして、表示機能には...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);

// Use model view so that rotation value is literal, not added.
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

// ... translation, etc ...

glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right
glEnd();

    // not neccecary to repeat, just good practice
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right
glEnd();

glFlush();
glDisable(GL_TEXTURE_2D);

glPopMatrix();

SwapBuffers();

したがって、これにより、背景に2番目の正方形がレンダリングされます。私はこれを見ることができますが、背後のテクスチャではなく、背景とブレンドされているように見えます(255ビットよりも200ビットアルファで暗いため、これを想定しています)...

透明なテクスチャが機能しない

ご覧のとおり、透明性はありません...どうすればこれを修正できますか?

4

1 に答える 1

9

したがって、ここにあったが削除された他の答えはこれに言及しました-一般に、アルファブレンディングが正しく機能するためには、カメラの座標系でオブジェクトを遠くから近くに並べ替える必要があります。
これが、ポリゴンが背景とブレンドされる理由です。深度テストを無効にすることで、これが実際に問題であることを確認できます。デプステストを行わないと、すべてのフラグメントが表示され、アルファブレンディングを確認できます。

これについては、このページで詳しく説明します。

于 2009-04-15T16:10:20.833 に答える