マニュアルの「オーバーレイ」ブレンド操作でアルファを処理する方法は?
-
11-10-2019 - |
質問
私はいくつかのマニュアル(ピクセルの歩行)画像処理で遊んでおり、標準の「オーバーレイ」ブレンドを再現しています。ここで「Photoshop Math」マクロを見ています:
http://www.nathanm.com/photoshop-blending-math/ (こちらも参照してください オーバーレイのより読みやすいバージョンについては)
両方のソース画像は、宛先と同様に、かなり標準的なRGBA(各8ビット)形式です。両方の画像が完全に不透明である場合(アルファは1.0)、結果は予想どおりに正しくブレンドされます。
しかし、私の「ブレンド」レイヤー(上の画像)が透明性を持っている場合、私は そのアルファをブレンド方程式にどのように充てますか 正しく。ブレンド層の透明なピクセルが結果に影響を与えず、ブレンド層の不透明なピクセルが通常どおりオーバーレイブレンドを行い、半透明なブレンド層ピクセルが結果にある程度のスケーリングされた効果をもたらすように機能することを期待しています。
誰かが私にブレンド方程式やこれを行う背後にある概念を説明できますか?
ボーナスポイント あなたが私がそれをするのを手伝うことができれば、結果の画像が正しく前提型のアルファを持っているようにそれを行うことができれば(両方のレイヤーで不透明ではないピクセルのみで作用するだけだと思います)。
ありがとう!
// factor in blendLayerA, (1-blendLayerA) somehow?
resultR = ChannelBlend_Overlay(baseLayerR, blendLayerR);
resultG = ChannelBlend_Overlay(baseLayerG, blendLayerG);
resultB = ChannelBlend_Overlay(baseLayerB, blendLayerB);
resultA = 1.0; // also, what should this be??
解決
ただ推測しますが、私は試してみます
resultA = 1 - (1-baseAlpha) * (1-blendAlpha)
他のヒント
ベースカラーとブレンド色をブレンドした後、ブレンド色のアルファを使用してブレンドから生じる元のベースカラーと色を混ぜます。
vec4 baseColor = ...;
vec4 blendColor = ...;
vec4 blendedColor = blend(baseColor, blendColor);
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor;
これを使用して、「オーバーレイ」に不透明なベースカラーと、多くの(半)透明なピクセルを備えたブレンドテクスチャをブレンドします。
私はこの問題を正確に実験していましたが、ベースとブレンド層の両方がストレートアルファで、そしてベースアルファでの結果のみを使用することが最善であることがわかったまでです。