设置混合状态时,在第二个RenderTarget中没有输出

时间:2017-07-05 10:41:42

标签: directx sharpdx

使用DX11在SharpDX中使用两个RenderTargets时出现了一个奇怪的问题。 我正在渲染一组可以分层的对象,并使用混合模式来实现部分透明度。在一次传递中对两个渲染目标进行渲染,第二个渲染目标用作颜色选择器 - 我只是将对象ID(整数)渲染到第二个目标,并在渲染后从鼠标下的纹理中检索对象ID

我遇到的问题令人沮丧,因为它并非在所有计算机上都会发生。实际上,它并没有发生在我们的任何开发机器上,而是在野外报道 - 通常在具有集成英特尔(HD)图形的机器上。在这些计算机上,第二个渲染目标中不会生成任何输出。我们已经能够在笔记本电脑上重现问题,如果我们设置混合状态,那么问题就解决了。显然这不是一个修复,因为我们需要混合。

主渲染目标(0)和颜色拾取目标的纹理描述如下所示:

var desc = new Texture2DDescription
        {
            BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
            Format = Format.B8G8R8A8_UNorm,
            Width = width,
            Height = height,
            MipLevels = 1,
            SampleDescription = sampleDesc,
            Usage = ResourceUsage.Default,
            OptionFlags = RenderTargetOptionFlags,
            CpuAccessFlags = CpuAccessFlags.None,
            ArraySize = 1
        };

var colourPickerDesc = new Texture2DDescription
            {
                BindFlags = BindFlags.RenderTarget,
                Format = Format.R32_SInt,
                Width = width,
                Height = height,
                MipLevels = 1,
                SampleDescription = new SampleDescription(1, 0),
                Usage = ResourceUsage.Default,
                OptionFlags = ResourceOptionFlags.None,
                CpuAccessFlags = CpuAccessFlags.None,
                ArraySize = 1,
            };

混合状态设置如下:

var blendStateDescription = new BlendStateDescription { AlphaToCoverageEnable = false };


        blendStateDescription.RenderTarget[0].IsBlendEnabled = true;
        blendStateDescription.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
        blendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
        blendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add;
        blendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.SourceAlpha;
        blendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.InverseSourceAlpha;
        blendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
        blendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

        _blendState = new BlendState(_device, blendStateDescription);

并在渲染开始时应用。我试过为RenderTarget [1]明确地将IsBlendEnabled设置为false,但它没有区别。

对此的任何帮助都是最受欢迎的 - 最终,我们可能不得不求助于制作两个渲染过程,但这会很烦人。

1 个答案:

答案 0 :(得分:0)

我现在已经解决了这个问题,尽管"修复"工作不完全清楚。给VTT提示,指出IndependentBlendEnable中的BlendStateDescription标志。单独设置该标志(为真)以及RenderTarget[1].IsBlendEnabled = false是不够的。最终有效的是填充RenderTarget[1]的一整套值以及上述标志。假设第二个RenderTarget中的所有其他值都将被忽略,因为混合被禁用,但由于某种原因,它们需要被填充。如前所述,这个问题只出现在某些显卡上,所以我不知道这是正确的行为,还是只是这些卡片的怪癖。