2017-07-05 12 views
0

DX11を使用してSharpDXで2つのレンダーターゲットを使用すると、私は奇妙な問題が発生します。 レイヤーできるオブジェクトのセットをレンダリングしており、部分的な透明性を実現するためにブレンドモードを使用しています。レンダリングは、1回のパスで2つのレンダーターゲットに対して行われ、2番目のレンダリングターゲットはカラーピッカーとして使用されます。この2番目のターゲットにオブジェクトID(整数)をレンダリングし、レンダリング後にマウスの下のテクスチャからオブジェクトIDを取得します。 。ブレンド状態が設定されているときに2番目のRenderTargetに出力がありません

私が問題になっているのは、すべてのコンピュータで発生しないため、イライラしています。実際に、当社の開発マシンでは発生しませんが、一般的にインテル(HD)グラフィックスを搭載したマシンでは野生で報告されています。これらのコンピュータでは、2番目のレンダーターゲットで出力が生成されません。ここでラップトップで問題を再現できました。にブレンド状態を設定しないと、問題は解決されます。明らかに、これは修正ではありません。ブレンドが必要なためです。

主レンダーターゲット(0)、このようなターゲットの外観を選ぶ色のテクスチャの説明:

var desc = new Texture2DDescription 
     { 
      BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, 
      Format = Format.B8G8R8A8_UNorm, 
      Width = width, 
      Height = height, 
      MipLevels = 1, 
      SampleDescription = sampleDesc, 
      Usage = ResourceUsage.Default, 
      OptionFlags = RenderTargetOptionFlags, 
      CpuAccessFlags = CpuAccessFlags.None, 
      ArraySize = 1 
     }; 

var colourPickerDesc = new Texture2DDescription 
      { 
       BindFlags = BindFlags.RenderTarget, 
       Format = Format.R32_SInt, 
       Width = width, 
       Height = height, 
       MipLevels = 1, 
       SampleDescription = new SampleDescription(1, 0), 
       Usage = ResourceUsage.Default, 
       OptionFlags = ResourceOptionFlags.None, 
       CpuAccessFlags = CpuAccessFlags.None, 
       ArraySize = 1, 
      }; 

ブレンド状態は次のように設定されている:

var blendStateDescription = new BlendStateDescription { AlphaToCoverageEnable = false }; 


     blendStateDescription.RenderTarget[0].IsBlendEnabled = true; 
     blendStateDescription.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha; 
     blendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.InverseSourceAlpha; 
     blendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All; 

     _blendState = new BlendState(_device, blendStateDescription); 

とで適用されますレンダリングの開始。私はRenderTarget [1]に対してIsBlendEnabledをfalseに明示的に設定しようとしましたが、違いはありません。

これについてのお手伝いが大歓迎です。最終的には2回のレンダーパスを行う必要がありますが、それは迷惑でしょう。

+0

「BlendStateDescription」の 'IndependentBlendEnable'フラグと何か関係があるかもしれません。 'RenderTarget [1]'(および残りの)ブレンド状態は、trueに設定されている場合にのみ使用されます。 – VTT

+0

チップのおかげで - 私は本当に解決策になるだろうと思っていたが、残念ながらそれは何の違いもない(まだ出力はない)。奇妙なことは、ほとんどのグラフィックスカードではうまく動作するが、一部ではうまくいかないということだ。間違いなく何か間違ったことをやっているが、何とかそれを取り除くことは間違いない。 – Matt

答えて

0

"修正プログラム"が完全にはっきりとはいかない理由がわかりましたが、私はこの問題を解決しました。私にBlendStateDescriptionIndependentBlendEnable旗を向けるためのVTTへのハットチップ。そのフラグをRenderTarget[1].IsBlendEnabled = falseと一緒に(trueに)設定するだけでは十分ではありませんでした。最後には、前述のフラグとともに、RenderTarget[1]の値の完全なセットを埋めていました。おそらく、2番目のRenderTargetの他のすべての値は、ブレンドが無効になっているため無視されますが、なんらかの理由でそれらを読み込む必要があります。前述したように、この問題は特定のグラフィックスカードにしか表示されないので、これが正しい動作であるかどうか、またはそれらのカードの奇抜なことはわかりません。

+0

「失敗」カードはどのDirect3Dハードウェア機能レベルですか? –

+0

私たちが必要とする最小値である10.1を確認します。障害が発生した(または直前に使用された)ローカルマシンは、DX11ハードウェアをサポートするHD4000(dxdiagのDDI 11.2)のみです。 – Matt

関連する問題