【问题标题】:Direct3D 9 Shadow Mapping Blend ModeDirect3D 9 阴影映射混合模式
【发布时间】:2011-05-05 10:19:20
【问题描述】:

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

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

如果有更多建议会很棒,

谢谢,

标记

【问题讨论】:

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


    【解决方案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 相乘。并将它们组合到新的目的地。

    【讨论】:

    • 我没有使用固定功能管道。我目前有 3 套着色器。第一组用于深度预通道。第二组用于从灯光位置输出场景的深度,第三组用于使用阴影贴图纹理深度来渲染场景上的阴影。我认为问题在于通道之间的混合。
    • 我假设目的地是渲染目标?来源是什么/如何设置?
    • Destination 是渲染目标,Source 是您设置为混合的纹理颜色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多