Direct3D 9阴影映射混合模式

Direct3D 9 Shadow Mapping Blend Mode

本文关键字:混合 模式 映射 阴影 Direct3D      更新时间:2023-10-16

我目前正在尝试在direct3d 9中绘制阴影。我正在尝试做一些多通道渲染,我很难理解如何使用/设置混合模式。

我已经完成了一个深度通道,它填充了深度缓冲区,然后我有一个循环,循环通过场景中的所有灯光。在这个循环中,我有两个循环它们都循环遍历场景中的所有形状

我有这样的设置

for(number of shapes)
{
  //render from camera position and fill depth buffer
}
for(number of lights)
{
  for(number of shapes)
  {
    //render to shadow map
  }
  for(number of shapes)
  {
    //render to screen
  }
}

在像素中,我可以看到它循环通过每个光,但当我运行它时,只显示光数组中的最后一个光。我想这和混合模式有关。

我已经查看了混合模式,并找到了有关源和目标混合的信息。这是我需要的吗/有人能帮我解释一下吗?

提前感谢,

标记

(编辑)我使用下面的代码

使两个灯都可见
hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

阴影看起来不正确,但我越来越接近想要的结果。

如果有更多的建议就太好了,

谢谢,马克

我也认为你有错误的阿尔法混合状态设置。我假设你做一个SRC混合和替换你的旧图像与新的一个,不做任何alpha混合。你得想想自己想要什么。我假设你想要一个SRC_OVER混合。
Porter Duff规则可以给你一个提示,它们很容易在directX中实现。请看这里的例子:
[编辑]我应该更仔细地阅读。

Alpha混合和像素着色器是独立的。所以你当然可以使用像素着色器来改变源的颜色值。也许可以添加一些特殊效果或任何你想尝试的东西。但是一旦你想在目标上混合你的源,你不想用新的像素替换所有的像素,你需要启用alpha混合。例如:像这样

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

这段代码将所有源像素与它们的alpha值相乘,所有目标像素与1-source_alpha相乘。并将它们合并到新的目标