7

Qt/C++ 2D OpenGL アプリケーションでテクスチャとして使用されている 2 つの png 画像を取得しました。1 つ目はある種の「中間」グラウンドとして使用され、2 つ目は「上に」レンダリングされる「オブジェクト」として使用されます (注: それらはすべて同じ z 値 atm を持っています。定義された順序)。「オブジェクト」テクスチャは部分的に半透明です。「中間」のテクスチャはほとんどソリッドです。問題は、私の「オブジェクト」テクスチャの半透明部分が、「中間」テクスチャではなく、無地の背景色になることです。

これを達成するためのヒントはありますか?

次の OpenGL フラグは、テクスチャのレンダリングに使用されます

glEnable (GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

助けてくれてありがとう。

編集:

より多くのコード:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);

glEnable(GL_TEXTURE_2D);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D, c->_texture);

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

glBegin(GL_QUADS);
{
    glTexCoord2i(0,0);
    glVertex2i(-128,-128);

    glTexCoord2i(0,1);
    glVertex2i(-128,128);

    glTexCoord2i(1,1);
    glVertex2i(128,128);

    glTexCoord2i(1,0);
    glVertex2i(128,-128);

}
glEnd();

glDisable(GL_TEXTURE_2D);

glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);

編集:テクスチャをロードする方法と、アルファチャンネルでロードすることができる限り

QImage img("./images/dummycar.png","PNG");
QImage t(QGLWidget::convertToGLFormat(img));
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

スクリーンショット: http://img824.imageshack.us/img824/1912/blackbox.png

Skyimage は「中間」で、背景は真っ黒です。

4

3 に答える 3

7
glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );

3のチャンネルを指定しているinternalFormatので、RGBA ではなく RGB です。GL_RGBA代わりにその位置で使用してみてください。

于 2010-07-02T10:56:27.087 に答える
4

glAlphaFuncをいじってみましたか?これを使用して、アルファ値に基づいてオブジェクト テクスチャの半透明部分の描画を破棄できます。

どちらかについてはどうですか

glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

また

glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

それが役立つことを願っています。

于 2010-07-02T07:27:12.367 に答える
3

オブジェクトごとに 1 つのテクスチャをレンダリングする場合は、glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) を使用する必要があります。

その後もテクスチャの周りにまだ「ボックス」がある場合は、アルファ チャネルなしでロードされています。

これは私にとって完璧に機能します:

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, texture2->tex);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glColor4f(0.5f, 1.0f, 0.5f, 0.5f);
    glBegin(GL_TRIANGLE_FAN);
    glTexCoord2f(0, 0);
    glVertex2f(x, y);
    glTexCoord2f(1, 0);
    glVertex2f(x + texture2->width, y);
    glTexCoord2f(1, 1);
    glVertex2f(x + texture2->width, y+ texture2->height);
    glTexCoord2f(0, 1);
    glVertex2f(x, y + texture2->height);
    glEnd();
    glDisable(GL_BLEND);

最後の色で着色された半透明のテクスチャー。

「テクスチャの周りにボックスがある」が問題を説明していない場合は、スクリーンショットを投稿する必要があります。

- 編集 -

スクリーンショットに基づいてデータを更新しました。

最初に背景をレンダリングしてから、車をレンダリングする必要があります。表面が透明であっても、Z バッファが値で満たされ、背景が車の下にあるため見えなくなるため、背景色が表示されます。

半透明のオブジェクトをレンダリングするときは、これらの規則に従う必要があります。

  1. すべての非透明オブジェクトは、半透明オブジェクトの前にレンダリングする必要があります。いつも。

  2. すべての透明なオブジェクトは、背面から前面のオブジェクトにレンダリングする必要があります。最も遠いオブジェクトを最初にレンダリングし、最も近いオブジェクトを 2 番目にレンダリングする必要があります。

  3. 後ろから前の順序でレンダリングできない場合 (GL_ADD ブレンドでソートされていないパーティクル)、glDepthMask(GL_FALSE) を使用して深度バッファへの書き込みを無効にする必要があります。そうしないと、醜い成果物が得られます。(スクリーンショットのように)。

于 2010-07-02T09:14:08.330 に答える