SharpDX:启用BlendState

时间:2012-10-12 09:41:08

标签: windows-8 directx sharpdx

我正在尝试使用“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;

输出全黑...也许我只需更改像素着色器中的某些内容?

1 个答案:

答案 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。