4

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

如何在 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%

4

2 回答 2

2

以下行是错误的:

pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);

您的意图可能是说明 alpha blender 应该做 ADD,但是 D3DTSS_COLOROP 设置不会影响最终的 blender,它会设置纹理组合器。您将其设置为向您从纹理中采样的颜色添加一些东西(前一个/下一个阶段的结果,或类似的东西),这是错误的。D3DTOP_SELECTARG1 或默认的 D3DTOP_MODULATE 应该可以完成这项工作。

你需要写的是:

pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);
于 2009-06-06T19:02:30.990 回答
0

数学似乎是正确的,并且您设置 DirectX 函数的方式应该有效。

我的建议是:

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

    • 如果您已经完成了这两项工作,我们深表歉意。
于 2009-06-06T18:24:03.300 回答