2

「SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate」を機能させようとしています。これがなければ、素敵なシーンがあります (スペースシューター用のテクスチャ付きのポリゴン)。私は過去 3 年間 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;           

そして、単に行うだけでも:

mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = false;

出力はすべて黒です..多分私はピクセルシェーダーで何かを変更する必要がありますか?

4

1 に答える 1

5

Direct3D11のすべてのリソースは不変であるため、新しいBlendstate(mDevice、new BlendStateDescription())を作成するときに、後で説明を変更することはできません。通常のワークフローは次のとおりです。

var blendDescription = new BlendDescription();
blendDescription.RenderTarget [0] .IsBlendEnabled =..//すべての値を設定します
[...]
var blendState = new BlendState(device、blendDescription);
context.OutputMerger.SetBlendState(blendState、...);

また、リソースオブジェクトはどこかに保存し、完全に終了したときに破棄する必要があります(ほとんどの場合、blendstatesの場合、アプリケーションの最後に)。そうしないと、メモリリークが発生します。

APIの使用法がわからない場合は、Direct3D11C++のサンプルを詳しく調べることをお勧めします。また、Frank.D.Lunaによる「DirectX11を使用した3Dゲームプログラミングの概要」のような本を読むことをお勧めします。これは、Direct3D11APIを開始して学習するのに最適です。

于 2012-10-12T11:20:02.203 に答える