1

Java の Porter-Duff 合成ルール (CLEAR、SRC、SRCOVER など) を実装するには、どの Direct3D レンダリング ステートを使用する必要がありますか?

4

4 に答える 4

2

私は 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

これらのチェーンはもう少し複雑で、シェーダーへの複数のパスまたは複数のテクスチャ入力が必要になります。

于 2008-09-15T23:14:41.597 に答える
1

「A in B」の場合、DestinationBlend をゼロにするべきではありませんか?

A イン B

SourceBlend = DestinationAlpha
DestinationBlend = Zero
于 2011-12-23T21:48:53.183 に答える
0

確認すべきことの1つは、アルファテストがオフになっていることを確認することです。

AlphaTestEnable = false

これがオンの場合(AlphaFunction=GreaterやReferenceAlpha=0など)、AlphaBlendEnableの設定に関係なく、クリアピクセルが破棄される可能性があります。

于 2008-09-16T05:49:31.193 に答える
0

"A" のレンダリング ステートを実装すると (つまり、ソース ピクセルの色/アルファをペイントし、宛先ピクセルの色/アルファを無視する)、ソースのアルファ値が 0 の場合、Direct3D は操作を正しく実行しないようです。ターゲット領域を透明で塗りつぶす代わりに、ターゲット領域が変更されていないことがわかります。ただし、ソースのアルファ値を 1 に変更すると、ターゲット領域が「実質的に」透明になります。これは、alphablending レンダリング ステートを無効にしても発生するため、これは最適化の試みであり、実際には Direct3D のバグであると推測できます。

この状況を除けば、Corey のレンダリング ステートは正しいように見えます。ありがとう、コーリー!

于 2008-09-16T01:31:40.487 に答える