2012-10-12 5 views
2

"SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate"를 작동 시키려고합니다. 이 없으면 멋진 장면 (Spaceshooter의 경우 텍스처가있는 다각형)이 생깁니다. 저는 지난 3 년 동안 OpenGL Graphics를 해왔습니다. OpenGL 에서처럼 간단 할 것 같습니다. Blending을 활성화하고 올바른 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; 

OUPUT가 모두 검은 색입니다 ... 어쩌면 난 그냥 픽셀에 뭔가를 변경해야

내가 무슨 짓을했는지입니다 셰이더?

답변

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++ 샘플을 자세히 살펴 보도록 조언합니다. 또한 Direct3D11 API를 배우고 배우기에 완벽한 Frank.D.Luna의 "DirectX 11로 3D 게임 프로그래밍 소개"와 같은 책을 읽으시기 바랍니다.

+0

좋습니다. 감사합니다. 잘 알려줘서 고맙습니다. 그래서 내 필요에 대한 여러 블렌드 모드를 만들어야합니다. 그리고 네, 결국 리소스를 처분 할 수 있도록 저장하고 있습니다 :) – lunatix

+0

마지막으로, 나는 효과 파일로 작업 할 수있었습니다! 답변 주셔서 감사합니다 :) – lunatix