我试图让“SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate”工作。没有这个,我有很好的场景(带有纹理的多边形,用于 Spaceshooter)。我在过去三年中完成了 OpenGL 图形,所以我认为它可能和 OpenGL 一样简单——只需启用混合并设置正确的 Dst/Src 模式。但是如果我设置一个新的 BlendStateDescription,所有的输出都是黑色的,即使“RenderTarget[x].IsBlendEnabled”设置为“false”。我搜索了一个教程或其他东西,找到了一个 - 但它使用了效果。所以我的问题很简单——我必须在 SharpDX 中使用技术和效果吗?没有其他方法可以进行简单的混合吗?
这就是我所做的:
mBackBuffer = Texture2D.FromSwapChain<Texture2D>(mSwapChain, 0);
mRenderView = new RenderTargetView(mDevice, mBackBuffer);
mContext.OutputMerger.SetTargets(mDepthStencilView, mRenderView);
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = true;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].BlendOperation = BlendOperation.Add;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
而且,即使只是简单地做:
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = false;
输出全黑..也许我只需要更改像素着色器中的某些内容?