指定されたアルファを使用して複数のレンダーターゲットをアルファブレンドすることは可能ですか?


9

レンダーターゲット0からNがあり、RT 0の4番目のコンポーネントに、マテリアルまたはマスクなどで指定されたアルファチャネルがあるとします。

最初のレンダーターゲットのアルファを使用して、ハードウェアコンポジターがレンダーターゲット1からNをブレンドすることは可能ですか?

回答:


5

私が知っている限り、すべてのブレンディング操作にRT 0のアルファを再利用する方法はDXまたはGLにはありません。残念ながら、それはハードウェアでサポートされているものではないようです。

レンダーターゲットごとに異なるブレンドモードを構成したり、一部のブレンドモードを有効にしたり、他のブレンドモードを無効にしたりできます。ただし、レンダーターゲットでブレンドが有効になっている場合は、常に独自のアルファが使用されます。

「デュアルソースブレンディング」と呼ばれるモード(DX11ドキュメントOGLドキュメントを参照)もあります。これにより、レンダーターゲットのアルファチャネルではなく、ピクセルシェーダーからの完全に別個の出力とブレンドするためのアルファを指定できます。ただし、このモードは現在のハードウェア上の1つのレンダーターゲットでのみ機能します。

私が知る限り、同じアルファを持つ複数のレンダーターゲットをブレンドするための唯一のオプションは次のとおりです。

  • すべてのレンダーターゲットに同じアルファを出力します(たとえば、遅延シェーディングの場合と同様に、アルファチャネルに他の値を格納する機能を犠牲にします)。
  • デュアルソースブレンドを使用して、レンダーターゲットごとに個別のパスでレンダリングを繰り返します。
  • UAV /画像読み込みストアを使用して、ピクセルシェーダーでブレンドを実行します(ジオメトリが画面スペースで自己重複していない場合にのみ機能します。これは、競合状態に対する保護がないため、おそらく少し遅いです)。
  • それをサポートするハードウェアでは、DX11.3 / DX12 Rasterizer-Order ViewsNV_fragment_shader_interlock、またはINTEL_fragment_shader_ordering(後者はAMD GPUによっても公開されます)。これらは同じものの3つの名前です。基本的には、ピクセルシェーダーの「クリティカルセクション」で、他のピクセルシェーダーの呼び出しに対して、テクスチャをアトミックに読み取り、変更、書き込みできます。それは本質的に任意のプログラム可能なブレンディングを可能にしますが、おそらくかなり遅く、最近のハードウェアでのみ利用可能です。

うん、これも私の結論だったと思う。これがDX12または(リリースされていない)Vulkanの場合であるかどうかはわかりませんか?あなたが述べたように、それは据え置きレンダリングのためのかなり大きなアプリケーションを持っています、そして今のところ既存の選択肢はどれも満足できるようには見えません。
jeremyong

@jeremyong申し訳ありませんが、DX12のブレンディング操作に変更はないと思います。バルカンについてはよくわかりませんが、私は驚くでしょう。ブレンディングハードウェアは変更されていません。FWIW、私が取り組んだゲームで、遅延デカールに対して弾丸#3のバリアントを実行し、ジオメトリを前処理して、重複しないグループに分離しました。
ネイサンリード、

推薦をありがとう。遅延デカールはまさに私が実装しているものです
jeremyong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.