DirectX10中的多通道前向渲染器

时间:2012-11-29 14:59:40

标签: rendering lighting directx-10

我正在使用DirectX 10实现一个Forward Renderer。我希望它能处理无限量的灯光,以便稍后我可以将它的性能与Deferred Renderer进行比较。所以基本上我使用的算法是:对于每个对象,对于每个光 - >设置灯光,绘制物体。使用加法混合,我为每个光渲染对象,总结每个光对其的贡献。一切都使用添加剂混合和禁用深度写入。我遇到的问题是,使用这种简单的方法,不同的对象混合在一起(因为深度写入被禁用),而我只是希望单个对象与其上的不同光贡献混合但仍然模糊其背后的其他对象。我怎样才能做到这一点? 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;
};

1 个答案:

答案 0 :(得分:1)

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

这种方法很可能在大量的灯/物体上非常低效。

我推荐这个article解释了如何渲染几个灯,它有不同的有趣实现。计算磁贴将无法在directx10中运行,但几何精灵版本可以轻松移植(我有一个dx9版本)

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