首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX图像纹理四角体显示底层控件的颜色,其中颜色是透明的

DirectX图像纹理四角体显示底层控件的颜色,其中颜色是透明的
EN

Stack Overflow用户
提问于 2016-09-22 10:41:03
回答 2查看 2.3K关注 0票数 0

我试图在纹理上画一个纹理,如下图所示。

黄色圆圈图像:

绿色圆圈图片:

如上面的企鹅图片所示,我试图把另一幅图像渲染成纹理,这是由绿色和黄色的圆圈显示的。在显示紫色的地方,图像是透明的。紫色是绘制纹理的底层控件的颜色。

渲染的顺序是: 1.渲染企鹅2.渲染绿色圆圈3.渲染黄色圆4.渲染绿色圆圈

现在我不知道为什么我会看到紫色的绿色/黄色的圆圈图像?

通过测试,我发现,如果我不设置混合因子,并使用不同的图像作为覆盖图像,它有一个alpha值,那么它可以很好地工作。所以,当我使用一个图像,它的alpha值为0时,会有一些变化。

几个星期以来,我一直在试图找出原因,但却找不出原因。

有什么建议或能指引我走向正确的方向吗?

注意:将Directx11与ShapDx结合使用

我也在另一个论坛这里上发布了这个问题,但是到目前为止没有什么好运气。

编辑:代码,以启用混合状态后,企鹅的图像,这是背景。

代码语言:javascript
复制
        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;

编辑:我一直在尝试不同的方法,试图缩小它,我可以结束混合工作,但不像预期,但设法缩小了范围。

当试图在图片上呈现图像时:

首先,我把四边形的画都分开了。使用这个类,我可以根据需要调用几个函数来绘制尽可能多的对象,包括在抽签调用中设置以下内容:

代码语言:javascript
复制
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将显示实际控件的颜色。

现在,如果我启用了AlphaBlending,我得到的只是一个填充标志png四角的灰色颜色。为此,我尝试更新当我采样纹理:ShaderTexture.Sample(取样器,input.TextureUV)时返回的rgb颜色;返回的颜色是黑色的: r=1、g=1、b= 1、a= 1。

  1. 如果我重用用于绘制背景图像的相同的四元对象,然后绘制标志png,则我的背景图像将绘制在表示标志png的四格内的旗png之下,而我的背景图像不是在较大的四角上绘制的。

现在从上面(在第2点中发现);如果我使用一个新的四角体绘制,这种混合似乎不起作用。

知道为什么会发生这种事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-29 12:39:22

好的,我来处理。

我使用以下步骤执行:

代码语言:javascript
复制
        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
EN

Stack Overflow用户

发布于 2016-09-24 15:49:58

这是因为当您呈现圆圈时,像素α也会写入,如果最终合成的图像必须是不透明的,您可以使用RGBX8曲面,或者遮住混合状态下的alpha通道--写色罩,并确保它保持为白色:

代码语言:javascript
复制
renderTargetDesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL & ~D3D11_COLOR_WRITE_ENABLE_ALPHA;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39636846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档