编辑:问题解决了!见帖子的结尾。
如何在DirectX 8中使用Photoshop实现“屏幕”混合模式?
信息,我已经找到了这个主题(http://www.ziggyware.com/readarticle.php?article_id=228):
Result = 1 – (1 – destination) * (1 – source) Result = 1 – (1 – source – destination + destination * source) Result = 1 – 1 + source + destination – destination * source Result = source + destination – destination * source Result = destination + source – source * destination Result = destination + source * (1 – destination)
现在我们已经完成了数学计算, 我们只需要设置混合模式:
BlendOperation = Add DestinationBlend = One SourceBlend = InvDestColor
我假设DirectX混合状态必须是:
pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);
这是对的吗? (我得错了结果)
Photoshop结果:
http://img192.imageshack.us/img192/7015/photoshopf.jpg
我在DirectX中的结果:
http://img193.imageshack.us/img193/2969/directx.jpg
解决问题: 公式不考虑图像alpha,要修复它你需要使图像背景为100%不透明度的纯黑色
答案 0 :(得分:2)
以下行错误:
pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
你的意图可能是状态alpha混合器应该做ADD,但是D3DTSS_COLOROP设置不会影响最终的混合器,而是设置纹理组合器。你设置它来添加一些东西(前一个/后一个阶段的结果,或类似的东西)到你从纹理中采样的颜色,这是错误的。 D3DTOP_SELECTARG1或默认的D3DTOP_MODULATE应该可以胜任。
你需要写的是:
pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);
答案 1 :(得分:0)
数学似乎是正确的,设置DirectX功能的方式应该有效。
我的建议是:
检查您是否可以执行其他混合模式,并确保它们生成正确的输出。