Windows 8 SharpDX:启用BlendState

Windows 8 SharpDX:启用BlendState,windows-8,directx,sharpdx,Windows 8,Directx,Sharpdx,我正在尝试让“SharpDX.Direct3D11.DeviceContext.OutputMerge.Blendstate”正常工作。如果没有这个,我有一个很好的场景(对于一个太空射手来说,上面有纹理的多边形)。我在过去的三年里做过OpenGL图形,所以我认为它可能和OpenGL一样简单——只需启用混合并设置正确的Dst/Src模式。但如果我设置了一个新的BlendStateDescription,则所有输出都是黑色的,即使“RenderTarget[x].IsBlendEnabled”设置为

我正在尝试让“SharpDX.Direct3D11.DeviceContext.OutputMerge.Blendstate”正常工作。如果没有这个,我有一个很好的场景(对于一个太空射手来说,上面有纹理的多边形)。我在过去的三年里做过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;           

输出都是黑色的。。也许我只需要更改像素着色器中的某些内容?

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, ...); var blendDescription=new blendDescription(); blendDescription.RenderTarget[0]。IsBlendEnabled=..//设置所有值 [...] var blendState=新的blendState(设备,blendDescription); context.outputMerge.SetBlendState(blendState,…); 此外,资源对象还需要存储在某个位置,并在您完全使用完它们后进行处置(大多数情况下,对于混合状态,在应用程序结束时),否则将导致内存泄漏


<>我建议你在不确定API使用情况时,仔细查看一些直接的3d11 C++样本。另外,我建议您阅读Frank.D.Luna的《使用DirectX 11进行3D游戏编程介绍》一书,这本书非常适合开始学习Direct3D11 API。

好的,谢谢,很高兴知道。因此,我必须根据自己的需要创建多种混合模式。。而且,是的,我正在存储它们以在最后处理资源:)最后,我设法使它与效果文件一起工作!谢谢你的回答:) var blendDescription = new BlendDescription(); blendDescription.RenderTarget[0].IsBlendEnabled = .. // set all values [...] var blendState = new BlendState(device, blendDescription); context.OutputMerger.SetBlendState(blendState, ...);