lun*_*tix 2 directx windows-8 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;
Run Code Online (Sandbox Code Playgroud)
并且,即使只是简单地做:
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = false;
Run Code Online (Sandbox Code Playgroud)
输出全是黑色..也许我只需更改像素着色器中的某些内容?
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.
| 归档时间: |
|
| 查看次数: |
2933 次 |
| 最近记录: |