1

OpenGLの別のテクスチャにテクスチャ (アルファ付き) を配置しようとしています。私は問題なくそれを行いますが、それは私が望んでいたものではありません: 私の最も近い画像の色は、背景画像(最も遠いテクスチャ)の影響を強く受け、赤にもかかわらずオレンジ色に見えます。

この問題を解決するブレンド (またはアルファを取り除く) 方法を知っている人はいますか?

ブレンディングの初期化:

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

描画シーン:

glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

//furthest image (background)
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex2f(0, 0);
    glTexCoord2f(1, 0); glVertex2f(500, 0);
    glTexCoord2f(1, 1); glVertex2f(500, 500);
    glTexCoord2f(0, 1); glVertex2f(0, 500);
glEnd();

//nearest image (appears orange, should be red) 
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex2f(100, 100);
    glTexCoord2f(1, 0); glVertex2f(300, 100);
    glTexCoord2f(1, 1); glVertex2f(300, 300);
    glTexCoord2f(0, 1); glVertex2f(100, 300);
glEnd();

glutSwapBuffers();

編集。これがどのように見えるかを描いた画像です: 問題

これがどのように見えるかのイメージです: 目標

4

3 に答える 3

2

このブレンド機能

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

あなたの問題の原因です。for destinationはGL_ONE、フレームバッファにすでに存在するものはすべて、アルファ値の着信カラーに追加されることを意味します。

あなたの場合、あなたの赤いテクスチャは緑がかった背景で追加されます。そして、赤+緑がかった=オレンジなので、これはあなたが得るものです。

必要なのは、宛先フレームバッファ内の前のコンテンツをアルファチャネルでマスクすることです。これは、

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

また、OpenGLの状態はオンデマンドで設定およびリセットされることを意図しているため、他のテクスチャを描画する場合は、ブレンドおよびブレンド関数に他の設定が必要になる場合があります。

于 2012-07-22T16:13:23.330 に答える
2

あなたが望むのは「アルファテスト」であり、ブレンドではないと思います。見る

glEnable(GL_ALPHA_TEST)
glAlphaFunc()

ブレンディングを有効のままにしたい場合は、使用する必要があります

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

これは、ソース アルファが 1 である場所でのみソース カラーを使用します。現在、関数はソース カラーを背景色に追加します。

色を混ぜたくない場合は、アルファ テストを使用することをお勧めします。これは、ブレンドよりも少ないリソースを使用するためです。

于 2012-07-22T15:53:10.487 に答える
0

皆さんの助けを借りて、次の方法で問題を解決できました。

  • テクスチャを PNG として再保存します (BMP にもかかわらず)
  • ブレンディング機能をglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

すべての貢献者に感謝します:)

于 2012-07-22T16:25:48.300 に答える