C++ Photoshop&x27;s";屏幕“;DirectX中的模式

C++ Photoshop&x27;s";屏幕“;DirectX中的模式,c++,directx,photoshop,C++,Directx,Photoshop,编辑:问题解决了!见文章末尾 如何在DirectX 8中从Photoshop实现“屏幕”混合模式 信息,我在这个主题()上找到了: 现在我们已经算出了数学, 我们只需设置混合模式: BlendOperation = Add DestinationBlend = One SourceBlend = InvDestColor 我假设DirectX混合状态必须是: pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); pD3DDe

编辑:问题解决了!见文章末尾

如何在DirectX 8中从Photoshop实现“屏幕”混合模式

信息,我在这个主题()上找到了:

现在我们已经算出了数学, 我们只需设置混合模式:

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结果:

我在DirectX中的结果:

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

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

我的建议是:

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

    • 如果你已经做了这两件事,请道歉

  • 下面的行是错误的:

    pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
    
    您的意图可能是说明alpha blender应该进行添加,但D3DTSS_COLOROP设置不会影响最终的blender,而是设置纹理组合器。将其设置为向从纹理中采样的颜色添加某些内容(上一个/下一个阶段的结果,或类似的内容),这是错误的。D3DTOP_选择arg1或默认D3DTOP_调制应完成此工作

    你需要写的是:

    pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);
    

    非常感谢。我已经在标题中添加了截图谢谢。正确的渲染状态是DirectX8中的D3DRS_BLENDOP。我已经修复了我的测试项目,但结果仍然与Photoshop不同。你们可以在页眉中看到截图和示例项目。当你们链接到的页面被写入时,你们需要将你们的图像用预先乘以的alpha表示。问题解决了。忘记添加解决方案-顶部的图像必须没有纯黑色背景的alpha。
    pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);