0

我正在使用 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;
};
4

1 回答 1

1

有几个选项可以处理多个灯光,如果您想使用多通道实现它,深度预通道是您的最佳选择(然后您使用 LESS_EQUAL 比较您的深度状态再次绘制)。

这种方法很可能在大量灯光/物体上效率很低。

我推荐这篇解释如何渲染几个灯光的文章,它有不同的有趣实现。计算图块在 directx10 中不起作用,但可以轻松移植几何精灵版本(我有它的 dx9 版本)

如果您仍然想要前向渲染,还有光索引技术,实现示例here

于 2012-12-01T21:41:05.533 回答