使用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,但它没有区别。
对此的任何帮助都是最受欢迎的 - 最终,我们可能不得不求助于制作两个渲染过程,但这会很烦人。
答案 0 :(得分:0)
我现在已经解决了这个问题,尽管"修复"工作不完全清楚。给VTT提示,指出IndependentBlendEnable
中的BlendStateDescription
标志。单独设置该标志(为真)以及RenderTarget[1].IsBlendEnabled = false
是不够的。最终有效的是填充RenderTarget[1]
的一整套值以及上述标志。假设第二个RenderTarget
中的所有其他值都将被忽略,因为混合被禁用,但由于某种原因,它们需要被填充。如前所述,这个问题只出现在某些显卡上,所以我不知道这是正确的行为,还是只是这些卡片的怪癖。