Java の Porter-Duff 合成ルール (CLEAR、SRC、SRCOVER など) を実装するには、どの Direct3D レンダリング ステートを使用する必要がありますか?
4 に答える
私は Java をあまり使用していませんが、1984 年のホワイト ペーパーに基づくと、レンダリング ステート ブレンド モードのかなり単純なマッピングであるはずです。
もちろん、通常のアルファ ブレンディング (SourceAlpha、InvSourceAlpha) や加算 (One、One) など、これら以外にもできることがあります。(既存の機能を移植しているという理由で、これらについて具体的に質問していると思いますか?そのため、他の組み合わせは気にしないかもしれません...)
とにかく、これらは Add の BlendOperation とその AlphaBlendEnable が true であることを前提としています。
クリア
SourceBlend = Zero
DestinationBlend = Zero
あ
SourceBlend = One
DestinationBlend = Zero
B
SourceBlend = Zero
DestinationBlend = One
A オーバー B
SourceBlend = One
DestinationBlend = InvSourceAlpha
B オーバー A
SourceBlend = InvDestinationAlpha
DestinationBlend = One
A イン B
SourceBlend = DestinationAlpha
DestinationBlend = One
BインA
SourceBlend = Zero
DestinationBlend = SourceAlpha
AアウトB
SourceBlend = InvDestinationAlpha
DestinationBlend = Zero
BアウトA
SourceBlend = Zero
DestinationBlend = InvSourceAlpha
Bの上にA
SourceBlend = DestinationAlpha
DestinationBlend = InvSourceAlpha
Aの上にB
SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha
A xor B
SourceBlend = InvDestinationAlpha
DestinationBlend = InvSourceAlpha
これらのチェーンはもう少し複雑で、シェーダーへの複数のパスまたは複数のテクスチャ入力が必要になります。
「A in B」の場合、DestinationBlend をゼロにするべきではありませんか?
A イン B
SourceBlend = DestinationAlpha
DestinationBlend = Zero
確認すべきことの1つは、アルファテストがオフになっていることを確認することです。
AlphaTestEnable = false
これがオンの場合(AlphaFunction=GreaterやReferenceAlpha=0など)、AlphaBlendEnableの設定に関係なく、クリアピクセルが破棄される可能性があります。
"A" のレンダリング ステートを実装すると (つまり、ソース ピクセルの色/アルファをペイントし、宛先ピクセルの色/アルファを無視する)、ソースのアルファ値が 0 の場合、Direct3D は操作を正しく実行しないようです。ターゲット領域を透明で塗りつぶす代わりに、ターゲット領域が変更されていないことがわかります。ただし、ソースのアルファ値を 1 に変更すると、ターゲット領域が「実質的に」透明になります。これは、alphablending レンダリング ステートを無効にしても発生するため、これは最適化の試みであり、実際には Direct3D のバグであると推測できます。
この状況を除けば、Corey のレンダリング ステートは正しいように見えます。ありがとう、コーリー!