2012-10-12 51 views
2

我試圖讓「SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate」工作。沒有這個,我有很好的場景(帶有紋理的Polygones,Spaceshooter)。我在過去三年中完成了OpenGL Graphics,所以我認爲它可能與OpenGL一樣簡單 - 只需啓用混合並設置正確的Dst/Src模式即可。但是如果我設置了一個新的BlendStateDescription,即使「RenderTarget [x] .IsBlendEnabled」設置爲「false」,所有輸出都是黑色的。 我搜索了一個教程或一些東西,找到一個 - 但它使用效果。所以我的問題很簡單 - 我必須在SharpDX中使用技術和效果嗎?沒有其他辦法可以簡單地混合?SharpDX:啓用BlendState

這是我做了什麼:

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; 

輸出中是全黑的..也許我只需要改變的東西在像素着色器?

回答

5

Direct3D11中的所有資源都是不可變的,因此當您創建新的Blendstate(mDevice,新的BlendStateDescription())時,以後不能更改說明。 正常的工作流程是:

 
var blendDescription = new BlendDescription(); 
blendDescription.RenderTarget[0].IsBlendEnabled = .. // set all values 
[...] 
var blendState = new BlendState(device, blendDescription); 
context.OutputMerger.SetBlendState(blendState, ...); 

而且資源對象需要存儲在某個地方,並設置當你完全與他們(大部分時間blendstates,在你的應用程序的結束)完成的,否則你將得到內存泄漏。

我建議您在不確定API使用情況時仔細查看一些Direct3D11 C++示例。此外,我建議您閱讀Frank.D.Luna的「使用DirectX 11進行3D遊戲編程簡介」一書,該書適合開始學習Direct3D11 API。

+0

好的,謝謝,多數民衆贊成在知道。所以我必須爲我的需要創建多種混合模式..並且,是的,我將它們存儲在最後處置資源:) – lunatix

+0

最後,我設法使它與效果文件一起工作!感謝您的回答 :) – lunatix