1

私の 2D シャドウ レンダリング テクニックを Directx から Opengl に移植しようとしている過程で、opengl ブレンダーに十分にアクセスできないという問題に遭遇しました。

しかし、最初に、次のことが理にかなっているように、私のアルゴリズムは次のとおりです。

デプス バッファーを使用せずに、すべてのスプライトを後ろから前に並べ替えてレンダリングします。シャドウ スプライトは、それらをキャストするオブジェクトの直前に描画され、下の 2 番目のブレンドステートである gShadowBlendState を使用します。これにより、フレーム バッファのアルファ チャネルにアルファ値のみが描画されます。

通常のオブジェクトのスプライトは、以下で最初に指定された gBlendState を使用します。これは、バックバッファへの通常のアルファ ブレンドです。ただし、バックバッファ アルファ チャネルから不透明な範囲でアルファも削除します。これにより、影の前にある不透明なオブジェクトを通して影が見えなくなります。

3 番目に描画され、他のすべての後に描画されるのは、以下の影の色と最終的なブレンド状態を使用してレンダリングするフルスクリーン クワッドです。不透明度にバックバッファのアルファ チャネルを使用し、以前に記述されたすべてのシャドウ情報を効果的に引き出します。

この演習の要点は、重なった場所で暗くならない影を取得することです。

    gBlendState.SrcBlend       = D3DBLEND_SRCALPHA;
    gBlendState.BlendOp        = D3DBLENDOP_ADD;
    gBlendState.DestBlend      = D3DBLEND_INVSRCALPHA;
    gBlendState.SrcBlendAlpha  = D3DBLEND_ZERO;
    gBlendState.BlendOpAlpha   = D3DBLENDOP_ADD;
    gBlendState.DestBlendAlpha = D3DBLEND_INVSRCALPHA;

    gShadowBlendState.SrcBlend       = D3DBLEND_ZERO;
    gShadowBlendState.BlendOp        = D3DBLENDOP_ADD;
    gShadowBlendState.DestBlend      = D3DBLEND_ONE;
    gShadowBlendState.SrcBlendAlpha  = D3DBLEND_ONE;
    gShadowBlendState.BlendOpAlpha   = D3DBLENDOP_MAX;
    gShadowBlendState.DestBlendAlpha = D3DBLEND_ONE;

    gShadowFillBlendState.SrcBlend       = D3DBLEND_DESTALPHA;
    gShadowFillBlendState.BlendOp        = D3DBLENDOP_ADD;
    gShadowFillBlendState.DestBlend      = D3DBLEND_INVDESTALPHA;
    gShadowFillBlendState.SrcBlendAlpha  = D3DBLEND_ONE;
    gShadowFillBlendState.BlendOpAlpha   = D3DBLENDOP_MAX;
    gShadowFillBlendState.DestBlendAlpha = D3DBLEND_ONE;

ともかく。私はこれをOpenGLでやろうとしています。現在、アルファブレンディングを有効にしています

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

しかし、色とアルファ成分を計算する方法について個別の指示を与える方法がわかりません。私の質問はこれです: OpenGL で glBlendFunc() よりもブレンダーを細かく制御する方法はありますか?

4

3 に答える 3

4

http://www.opengl.org/registry/specs/EXT/blend_func_separate.txt

于 2009-07-05T10:05:46.943 に答える
1

ここに答えを残しました:

http://pastie.org/542369

ただし、問題が 1 つあります。すべての GL_ADD を GL_FUNC_ADD に置き換えます。私の間違い。

于 2009-07-11T15:03:17.530 に答える
1

より細かく制御できるかどうかはわかりませんが、glColorMask を使用して最初にカラー チャネルをレンダリングし、次にアルファ チャネルをレンダリングすることで、やりたいことのほとんどを達成できるはずです。最後のステップは変更されないようです。

于 2009-07-03T10:45:13.990 に答える