DirectX图像纹理四边形显示底层控件颜色,它是透明的

时间:2016-09-22 10:41:04

标签: c# directx directx-11 texture2d sharpdx

我正在尝试在纹理上绘制纹理,如下图所示。 enter image description here

黄圈图片: enter image description here

绿色圆圈图片: enter image description here

如上图所示的企鹅,我试图渲染另一个图像作为纹理,用绿色和黄色圆圈表示。图像是透明的,其中显示紫色。紫色是绘制纹理的基础控件的颜色。

渲染顺序为: 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);

现在,通过广泛的测试和玩弄我所发现的:

  1. 我有一个绘制背景的四边形绘图对象和一个单独的四边形对象来绘制标记png。使用这种方式,png将显示实际的控件颜色。
  2. 现在,如果我启用AlphaBlending,我得到的只是填充标志png quad的灰色。另外为此我尝试更新渲染时,我采样纹理时返回的rgb颜色: ShaderTexture.Sample(Sampler,input.TextureUV); 返回的颜色是黑色:r = 1,g = 1,b = 1,a = 1

    1. 如果我重复使用我用于绘制背景图像的相同四边形对象,然后绘制标记png,那么我的背景图像将绘制在四边形内的标志png下面,表示标记png,而我的背景图像不是四边形在较大的四边形上。
    2. 现在从上面(在第2点找到);如果我使用新的四边形绘图,似乎混合不起作用。

      为什么会发生这种情况的任何想法?

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;