C# 字母混合宽度DirectX和SharpDX给出奇怪的结果

C# 字母混合宽度DirectX和SharpDX给出奇怪的结果,c#,wpf,directx,sharpdx,C#,Wpf,Directx,Sharpdx,我一直试图让AlphaBlending与DX9+SharpDX+WPF组合工作,但就是无法从中得到正确的结果 下面是两个三角形的样子,第一个是完全不透明的灰色,另一个是相同的灰色,但alpha为0.5 问题是,出于某种原因,半透明灰色被添加到目标灰色中,即使据我所知,它也应该用(源*源因子)+(目标*目标因子)计算,应该是(0.5*0.5)+(0.5*(1-0.5))=0.5,但它不是 代码中有趣的部分: device9.SetRenderState(D3D9.RenderState.Alph

我一直试图让AlphaBlending与DX9+SharpDX+WPF组合工作,但就是无法从中得到正确的结果

下面是两个三角形的样子,第一个是完全不透明的灰色,另一个是相同的灰色,但alpha为0.5

问题是,出于某种原因,半透明灰色被添加到目标灰色中,即使据我所知,它也应该用(源*源因子)+(目标*目标因子)计算,应该是(0.5*0.5)+(0.5*(1-0.5))=0.5,但它不是

代码中有趣的部分:

device9.SetRenderState(D3D9.RenderState.AlphaBlendEnable, true);
device9.SetRenderState(D3D9.RenderState.SourceBlend, D3D9.Blend.SourceAlpha);
device9.SetRenderState(D3D9.RenderState.DestinationBlend, D3D9.Blend.InverseSourceAlpha);
device9.SetRenderState(D3D9.RenderState.BlendOperation, D3D9.BlendOperation.Add);
我有一个HLSL着色器,它为顶点获取位置和颜色,还有一个恒定的Alpha值,像素着色器如下所示:

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    return float4(input.Color[0], input.Color[1], input.Color[2], input.Color[3] * Alpha);
}

那么为什么这是错误的呢?在我看来,如果你有一个半透明的对象,你可以通过它看到其他对象,这就是这里发生的事情,对吗?input.Color中的值是什么?两个三角形的Alpha设置为什么?@Jaska:实际上我们需要看更多的代码。一定有什么东西在改变DX9混合状态,在您将其设置为如上所述和DP/DIP调用之间…@Goz WPF似乎需要预乘alpha,因此解决方案是将sourceblend设置为1,将destination设置为invsourcealpha,然后在着色器代码中预乘,我仍然不完全理解这一点,但有效。。