DirectX中的Photoshop“屏幕”模式

时间:2009-06-06 17:40:55

标签: c++ directx photoshop

编辑:问题解决了!见帖子的结尾。

如何在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);

这是对的吗? (我得错了结果)

示例项目:Link Mirror

Photoshop结果:

http://img192.imageshack.us/img192/7015/photoshopf.jpg

我在DirectX中的结果:

http://img193.imageshack.us/img193/2969/directx.jpg

解决问题: 公式不考虑图像alpha,要修复它你需要使图像背景为100%不透明度的纯黑色

2 个答案:

答案 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功能的方式应该有效。

我的建议是:

  1. 使用在Photoshop中使用的相同图像,因此您知道它不能正确制作纯白色(可能)。
  2. 检查您是否可以执行其他混合模式,并确保它们生成正确的输出。

    • 道歉,如果你已经完成了这两件事。