我目前正在尝试在 direct3d 9 中的场景上绘制阴影。我正在尝试进行一些多 channel 渲染,但我无法理解如何使用/设置混合模式。
我已经完成了一个填充深度缓冲区的深度 channel ,然后我有一个循环遍历场景中的所有灯光。在那个循环中,我有 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);
阴影看起来不正确,但我越来越接近期望的结果。
如果有更多的建议,那就太好了,
谢谢,
标记
最佳答案
我还认为您设置了错误的 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 相乘。并将它们组合到新的目的地。
关于c++ - Direct3D 9 阴影贴图混合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5896098/