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;
};