0

我目前正在尝试在 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);

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

任何更多的建议会很棒,

谢谢,

标记

4

1 回答 1

1

我还认为您设置了错误的 alpha 混合状态。我假设您进行 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 相乘。并将它们结合到新的目的地。

于 2011-05-05T11:54:55.653 回答