我正在尝试使用“SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate”。没有这个,我有一个很好的场景(Polygones上有纹理,对于Spaceshooter)。我在过去的三年里完成了OpenGL Graphics,所以我认为它可能就像在OpenGL中一样简单 - 只需启用Blending并设置正确的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;
输出全黑...也许我只需更改像素着色器中的某些内容?
答案 0 :(得分:5)
Direct3D11中的所有资源都是不可变的,因此在创建新的Blendstate(mDevice,new BlendStateDescription())时,您无法在以后更改说明。 正常的工作流程是:
var blendDescription = new BlendDescription(); blendDescription.RenderTarget[0].IsBlendEnabled = .. // set all values [...] var blendState = new BlendState(device, blendDescription); context.OutputMerger.SetBlendState(blendState, ...);
此外,资源对象需要存储在某个地方,并在您完全使用它们时处理(大部分时间用于混合状态,在应用程序结束时),否则会出现内存泄漏。
我建议您在不确定API使用情况时仔细查看一些Direct3D11 C ++示例。另外,我建议你阅读Frank.D.Luna撰写的“DirectX 11 3D游戏编程简介”这本书,非常适合开始学习Direct3D11 API。