3

スプライト アニメーション (OpenGL + C++) を使用しています。ブレンドの作業に問題があります。

背景が黒い画像を読み込んで、画像の周りに黒いブロックが表示されることなく、別のテクスチャの上に描画しようとしています。画像にはアルファ チャネルがあり、ブレンドが有効になっています。

さまざまなブレンド機能で遊んでみました。ブロック状の画像または半透明の画像になります。

画像編集ソフトウェアを使用する代わりに、黒い背景を透明な色に置き換えるとできることはわかっていますが、それを使用せずに、画像マスクを使用せずにこれを機能させたいと思います。

私の状況をよりよく理解するための例。

イメージとイメージ オーバー テクスチャが正しく行われていない:

ここに画像の説明を入力

私が望む方法:

ここに画像の説明を入力

これが私が使用しているコードの一部です。多くのコードがいくつかのクラスに分散しているため、最も関連性が高いと思われるものを選びました。

    glEnable(GL_DEPTH_TEST);
    ....
    ....
    glEnable(GL_TEXTURE_2D);
    /*Drawing the image with black background first*/
    glBindTexture(GL_TEXTURE_2D, blockImage);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
        //drawing code
        ...
    ...
    ...
    /*background texture is drawn last*/
    glBindTexture(GL_TEXTURE_2D, bgImage);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glBlendFunc(GL_ONE, GL_DST_ALPHA);
    //drawing code
        ...
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);

これを行うために実際のコードは必要ありません。ロジックの簡単な説明 (描画とブレンドの順序) で十分です。

4

1 に答える 1

1

OpenGL 固定機能パイプラインには、カラー キーイングのサポートが組み込まれていません。そうしたい場合は、シェーダーを記述してフラグメントの色をテストし、discard操作を使用できます。

固定関数でこれを行う場合は、アルファ チャネルを適切に使用する必要があります (前処理ですべての黒い領域をアルファ = 0 にします)。

于 2012-06-25T18:59:41.193 に答える