0

複数のレイヤを重ねるときは、少なくとも 1 回は「空の」画像または背景と組み合わせる必要があります。しかし、「空」に勝るものはありません。透明な黒または透明な白です。完全に透明であっても、通常は表示時に無視される色があります。

私は次のことを望みます:

Destination = Image1 + Image2

これを行うには、実際にこれを行います:

Clear(Destination, 0); // Clear it with transparent black
Blend Image1 over Destination
Blend Image2 over Destination

Destination は透明な黒ですが、黒が最終的な結果に影響することは避けたいと思います。透明な白で宛先をクリアすることはできますが、この例でのみ機能し、暗い画像でも同じ問題が発生します。

組み合わせ問題

結果が次のようになる理由を理解しています: directx ブレンドフォーミュラは次のように設定されています:

BlendOp = Add;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;

宛先のアルファ (DestAlpha) は、このフォーミュラではまったく考慮されていません。2 つの画像を別の場所にレンダリングする前にブレンドするという日常的な問題を実装するには、どうすればよいでしょうか?

4

1 に答える 1

1

通常のブレンディング操作ではこれを達成することはできませんが、適切なシェーダーを作成してブレンディングを行うことができるかもしれません。追加のテクスチャをレンダー ターゲットとしてレンダリングし、このテクスチャをピクセルシェーダーに設定します。ここで、書き込まれたアルファ値を分岐します。background-alpha がゼロの場合は、imagecolor を書き込みます。そうでない場合は、このピクセルに既に画像が書き込まれており、シェーダーで通常のアルファブレンディングを実行できます。このブランチを使用して、ピクセルが空であるか、以前に書き込まれたかを検出し、黒色が影響を与えないようにします。お役に立てれば :)

私が何を意味するかを視覚化するための小さな例:

float4 targetColor = tex2D(backgroundSampler,screen.TexCoord);
float4 diffuse = tex2D(imageSampler,image.TexCoord);
// overwrite black background
if (targetColor.a == 0.0) {
  return diffuse;
}
// do alphablending
return targetColor*(1-diffuse.a)+diffuse*(diffuse.a);
于 2012-12-11T12:56:38.530 に答える