Direct3D 9阴影贴图混合模式

时间:2011-05-05 10:19:21

标签: c++ maps shadow directx-9 direct3d9

我目前正在尝试在direct3d 9中的场景上绘制阴影。我正在尝试进行多次渲染,并且无法理解如何使用/设置混合模式。

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

我有这种设置

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

在pix中我可以看到它遍历每个灯光,但是当我运行它时,只显示灯光阵列中的最后一个灯光。我认为这与混合模式有关。

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

提前致谢,

标记

[修改] 我使用以下代码可以看到两个灯光

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

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

任何更多建议都会很棒,

谢谢,

标记

1 个答案:

答案 0 :(得分:1)

我还认为你设置了错误的alpha混合状态。我假设你做了一个SRC混合并用新的图像替换旧图像而没有进行任何alpha混合。 你需要考虑你想要的东西。我假设你想要一个SRC_OVER混合 Porter Duff规则可以为您提供一个提示,并且在directX中很容易实现。举例来看here [编辑] 我应该仔细阅读。

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。并将它们组合到新目的地。