我目前正在尝试在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);
阴影看起来不正确,但我越来越接近理想的结果。
任何更多建议都会很棒,
谢谢,
标记
答案 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。并将它们组合到新目的地。