如上图所示的企鹅,我试图渲染另一个图像作为纹理,用绿色和黄色圆圈表示。图像是透明的,其中显示紫色。紫色是绘制纹理的基础控件的颜色。
渲染顺序为: 1.渲染企鹅 2.渲染绿色圆圈 3.呈现黄色圆圈 4.渲染绿色圆圈
现在我不确定为什么我会看到绿色/黄色圆圈图像的紫色?
从测试我发现的是,如果我没有设置混合因子并使用不同的图像作为具有alpha值的叠加图像,那么它可以正常工作。因此,当我使用其alpha值为0的图像时,似乎会发生一些事情。
我几周来一直试图找出背后的原因,但无法弄清楚原因。
有任何建议或可以指引我进入正确的方向吗?
注意:将Directx11与ShapDx一起使用
P.S。我也在另一个论坛here上发布了这个问题,但到目前为止还没有运气。
编辑: 在渲染作为背景的企鹅图像后启用blendstate的代码
var renderTargetDesc = new RenderTargetBlendDescription();
renderTargetDesc.IsBlendEnabled = true;
renderTargetDesc.SourceBlend = BlendOption.SourceAlpha;
renderTargetDesc.DestinationBlend = BlendOption.InverseSourceAlpha;
renderTargetDesc.BlendOperation = BlendOperation.Add;
renderTargetDesc.SourceAlphaBlend = BlendOption.One;
renderTargetDesc.DestinationAlphaBlend = BlendOption.Zero;
renderTargetDesc.AlphaBlendOperation = BlendOperation.Add;
renderTargetDesc.RenderTargetWriteMask = ColorWriteMaskFlags.All;
BlendStateDescription desc = new BlendStateDescription();
desc.AlphaToCoverageEnable = false;
desc.IndependentBlendEnable = false;
if (m_blendStateEnabled == null)
{
m_blendStateEnabled = new BlendState(m_Dx11Device, desc);
}
desc.RenderTarget[0] = renderTargetDesc;
desc.RenderTarget[1] = renderTargetDesc;
m_Dx11Device.ImmediateContext.OutputMerger.BlendState = m_blendStateEnabled;
m_Dx11Device.ImmediateContext.OutputMerger.BlendFactor = new Color4(0, 0, 0, 0);
m_Dx11Device.ImmediateContext.OutputMerger.BlendSampleMask = 0x0F;
P.S。编辑: 我一直在试图通过尝试缩小它来尝试不同的方式,我可以总结混合工作,但不是按预期,但已设法缩小范围。
尝试在Picture in Picture中渲染图像时:
首先,我在一个类中分离了所有四边形的绘制。使用这个类,我可以根据需要绘制尽可能多的对象,调用几个函数,包括在绘制调用上设置以下内容:
DxDevice.ImmediateContext.InputAssembler.InputLayout = m_shaderData.InputLayoutConfig;
DxDevice.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip;
SetVertexBuffer();
DxDevice.ImmediateContext.VertexShader.Set(m_shaderData.VertexShaderConfig);
DxDevice.ImmediateContext.PixelShader.Set(m_shaderData.PixelShaderConfig);
DxDevice.ImmediateContext.Draw(4, 0);
现在,通过广泛的测试和玩弄我所发现的:
现在,如果我启用AlphaBlending,我得到的只是填充标志png quad的灰色。另外为此我尝试更新渲染时,我采样纹理时返回的rgb颜色: ShaderTexture.Sample(Sampler,input.TextureUV); 返回的颜色是黑色:r = 1,g = 1,b = 1,a = 1
现在从上面(在第2点找到);如果我使用新的四边形绘图,似乎混合不起作用。
为什么会发生这种情况的任何想法?
答案 0 :(得分:1)
好的,我让这个工作了。
我使用以下步骤执行:
var renderTargetDesc = new RenderTargetBlendDescription();
renderTargetDesc.IsBlendEnabled = true;
renderTargetDesc.SourceBlend = BlendOption.SourceAlpha;
renderTargetDesc.DestinationBlend = BlendOption.InverseSourceAlpha;
renderTargetDesc.BlendOperation = BlendOperation.Add;
renderTargetDesc.SourceAlphaBlend = BlendOption.Zero;
renderTargetDesc.DestinationAlphaBlend = BlendOption.One;
renderTargetDesc.AlphaBlendOperation = BlendOperation.Add;
renderTargetDesc.RenderTargetWriteMask = ColorWriteMaskFlags.All;
BlendStateDescription desc = new BlendStateDescription();
desc.AlphaToCoverageEnable = false;
desc.IndependentBlendEnable = false;
desc.RenderTarget[0] = renderTargetDesc;
var blendStateEnabled = new BlendState(DxDevice, desc);
var blendFactor = new Color4(0, 0, 0, 0);
var iSampleMask = ~0;
DxDevice.ImmediateContext.OutputMerger.SetBlendState(blendStateEnabled, blendFactor, iSampleMask);
UpdateShaderResource();
DxDevice.ImmediateContext.InputAssembler.InputLayout = m_shaderData.InputLayoutConfig;
DxDevice.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip;
SetVertexBuffer();
DxDevice.ImmediateContext.VertexShader.Set(m_shaderData.VertexShaderConfig);
DxDevice.ImmediateContext.PixelShader.Set(m_shaderData.PixelShaderConfig);
DxDevice.ImmediateContext.OutputMerger.BlendState = null;
答案 1 :(得分:0)
这是因为当您渲染圆形时,像素alpha也会写入,如果您的最终合成图像必须是不透明的,您可以使用RGBX8曲面,或者在混合状态写入颜色掩码中遮蔽alpha通道,以及一定要把它保持白色:
renderTargetDesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL & ~D3D11_COLOR_WRITE_ENABLE_ALPHA;