0

DirectX 10 でフォワード レンダラーを実装しています。後でそのパフォーマンスをディファード レンダラーと比較できるように、無制限の量のライトを処理できるようにしたいと考えています。したがって、基本的に私が使用しているアルゴリズムは次のとおりです。すべてのオブジェクト、すべてのライト -> ライトを設定し、オブジェクトを描画します。加算ブレンディングを使用して、各ライトのオブジェクトをレンダリングし、オブジェクト上のすべてのライトの影響を合計します。加算ブレンディングと深度書き込みの無効化を使用して、すべてが機能します。私が抱えている問題は、この単純なアプローチを使用すると、異なるオブジェクトが一緒にブレンドされることです (深度書き込みが無効になっているため)。一方、単一のオブジェクトを異なる光の寄与とブレンドし、その背後にある他のオブジェクトを覆い隠したいだけです。 . これどうやってするの?Zプリパスは解決策ですか? どんな提案でも大歓迎です。ありがとう。

これは、HLSL シェーダーで使用するブレンドと深度/ステンシルの状態です。

DepthStencilState NoDepthWritesDSS
{
    DepthEnable = true;
    DepthWriteMask = Zero;
    StencilEnable = true;
    StencilReadMask = 0xff;
    StencilWriteMask = 0xff;
    FrontFaceStencilFunc = Always;
    FrontFaceStencilPass = Incr;
    FrontFaceStencilFail = Keep;
    BackFaceStencilFunc = Always;
    BackFaceStencilPass = Incr;
    BackFaceStencilFail = Keep;
};

BlendState BlendingAddBS
{
    AlphaToCoverageEnable = false;
    BlendEnable[0] = true;
    SrcBlend = ONE;
    DestBlend = ONE;
    BlendOp = ADD;
    SrcBlendAlpha = ZERO;
    DestBlendAlpha = ZERO;
    BlendOpAlpha = ADD;
    RenderTargetWriteMask[0] = 0x0F;
};
4

1 に答える 1

1

マルチパスを使用して実装する場合は、複数のライトを処理するオプションがいくつかあります。深度プリパスが最適なオプションです (その後、深度状態で LESS_EQUAL 比較を使用して再度描画します)。

このアプローチは、多数のライト/オブジェクトでは非常に非効率的です。

複数のライトをレンダリングする方法を説明するこの記事をお勧めします。さまざまな興味深い実装があります。計算タイルは directx10 では機能しませんが、ジオメトリ スプライト バージョンは簡単に移植できます (dx9 バージョンを持っています)。

それでもフォワード レンダリングが必要な場合は、ライト インデックス テクニックもあります。実装例はこちら

于 2012-12-01T21:41:05.533 に答える