我正在使用 DirectX 10 实现正向渲染器。我希望它能够处理无限量的灯光,以便稍后将其性能与延迟渲染器进行比较。所以基本上我使用的算法是:对于每个对象,对于每个灯光 -> 设置灯光,绘制对象。使用加法混合,我为每个灯光渲染对象,并将每个灯光对它的贡献相加。一切都使用加法混合和禁用深度写入。我遇到的问题是,使用这种简单的方法,不同的对象被混合在一起(因为深度写入被禁用),而我只想要一个对象与它上面的不同光贡献混合,但仍然掩盖它后面的其他对象. 我怎样才能做到这一点?Z pre-pass 是解决方案吗?任何建议将不胜感激。谢谢。
这是我在 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;
};