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

黄色圆圈图像:

绿色圆圈图片:

如上面的企鹅图片所示,我试图把另一幅图像渲染成纹理,这是由绿色和黄色的圆圈显示的。在显示紫色的地方,图像是透明的。紫色是绘制纹理的底层控件的颜色。
渲染的顺序是: 1.渲染企鹅2.渲染绿色圆圈3.渲染黄色圆4.渲染绿色圆圈
现在我不知道为什么我会看到紫色的绿色/黄色的圆圈图像?
通过测试,我发现,如果我不设置混合因子,并使用不同的图像作为覆盖图像,它有一个alpha值,那么它可以很好地工作。所以,当我使用一个图像,它的alpha值为0时,会有一些变化。
几个星期以来,我一直在试图找出原因,但却找不出原因。
有什么建议或能指引我走向正确的方向吗?
注意:将Directx11与ShapDx结合使用
我也在另一个论坛这里上发布了这个问题,但是到目前为止没有什么好运气。
编辑:代码,以启用混合状态后,企鹅的图像,这是背景。
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;编辑:我一直在尝试不同的方法,试图缩小它,我可以结束混合工作,但不像预期,但设法缩小了范围。
当试图在图片上呈现图像时:
首先,我把四边形的画都分开了。使用这个类,我可以根据需要调用几个函数来绘制尽可能多的对象,包括在抽签调用中设置以下内容:
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四角的灰色颜色。为此,我尝试更新当我采样纹理:ShaderTexture.Sample(取样器,input.TextureUV)时返回的rgb颜色;返回的颜色是黑色的: r=1、g=1、b= 1、a= 1。
现在从上面(在第2点中发现);如果我使用一个新的四角体绘制,这种混合似乎不起作用。
知道为什么会发生这种事吗?
发布于 2016-09-29 12:39:22
好的,我来处理。
我使用以下步骤执行:
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;发布于 2016-09-24 15:49:58
这是因为当您呈现圆圈时,像素α也会写入,如果最终合成的图像必须是不透明的,您可以使用RGBX8曲面,或者遮住混合状态下的alpha通道--写色罩,并确保它保持为白色:
renderTargetDesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL & ~D3D11_COLOR_WRITE_ENABLE_ALPHA;https://stackoverflow.com/questions/39636846
复制相似问题