Direct3D 9阴影映射混合模式
Direct3D 9 Shadow Mapping Blend Mode
我目前正在尝试在direct3d 9中绘制阴影。我正在尝试做一些多通道渲染,我很难理解如何使用/设置混合模式。
我已经完成了一个深度通道,它填充了深度缓冲区,然后我有一个循环,循环通过场景中的所有灯光。在这个循环中,我有两个循环它们都循环遍历场景中的所有形状
我有这样的设置
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
}
}
在像素中,我可以看到它循环通过每个光,但当我运行它时,只显示光数组中的最后一个光。我想这和混合模式有关。
我已经查看了混合模式,并找到了有关源和目标混合的信息。这是我需要的吗/有人能帮我解释一下吗?
提前感谢,
标记(编辑)我使用下面的代码
使两个灯都可见hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
阴影看起来不正确,但我越来越接近想要的结果。
如果有更多的建议就太好了,
谢谢,马克
我也认为你有错误的阿尔法混合状态设置。我假设你做一个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相乘。并将它们合并到新的目标
相关文章:
- OpenCV 混合模式实现:为什么看似等效的操作会产生不同的结果?
- 混合模式程序集是针对版本 'v2.0.50727' 构建的 ...本机C++/Visual C++/C# 项目错误
- Visual Studio混合模式调试是否可以附加到Jupyter笔记本以同时调试C++和Python
- 如何链接到C++/Cli混合模式dll中的本机类
- 调试混合模式应用程序(C# 和非托管 C++)时"The breakpoint will not currently be hit"错误
- 混合模式程序集(C++/CLI项目)在.NET Core上工作吗
- 如何处理混合模式项目中的打印
- c++ (Direct2D) 中的混合模式
- 链接到混合模式dll中的presentationcore.dll
- 通过混合模式c++ /CLI DLL从ETL工具中使用托管c# DLL -可能
- 内存管理在c++混合模式下的应用
- 如何将使用boost::asio的本地c++静态库导入CLI/ c++混合模式应用程序?
- 卸载混合模式组件
- 从混合模式c++项目中的CLR-to-SEH异常中获取明智的信息
- 用于混合模式项目的内存泄漏检测:托管、非托管和本机
- 在新托管线程中通过 C# 在混合模式程序集中调用 STL 矢量的push_back
- 正在尝试转换混合模式的公式
- 正在尝试转换混合模式的公式
- VS2010 中使用 .NET 3.5 的混合模式调试
- 使用本机C++、托管 C++ CLI 和 C# 解决方案在混合模式下进行调试