OpenGLブレンド関数とピクチャブレンドモード
2899 ワード
一、OpenGL関数は二つを提供する。
glBlendFunc (GLenum sfactor, GLenum dfactor)
および
glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
計算時の2色の混合因子を設定するために使用される.2色はそれぞれソース画像(提供された素材図)とターゲット画像(bufferで描かれた図)である.(ここでは混合因子のみが提供され、色はソースマップとターゲットマップによって提供されることに注意してください).
色と透明度の混合係数を設定するために使用されます.最初の2つのパラメータは、glBlendFuncと同様に色混合係数です.次の2つのパラメータは、結果図の透明度を計算する透明度ブレンド係数です.
二、画像混合モードの概要
参考Adobe Photoshopの概要https://helpx.adobe.com/cn/photoshop/using/blending-modes.html、いくつかのよく使われる羅列を選んで以下のようにします.
各ピクセルを通常(Normal)で編集または描画し、結果色にします.これが既定のモードです.(ビットマップ画像またはインデックスカラー画像を処理する場合、「通常」モードはしきい値とも呼ばれます.)メモ:透明度がある場合は、透明度に基づいてブレンドします.
マルチプライ(Multiply)各チャネルのカラー情報を表示し、ベースカラーとブレンドカラーをマルチプライします.結果色は常に暗い色になります.任意の色が黒の正片に重なると黒が発生します.任意の色が白い正片と重なっても変わらない.黒または白以外の色でペイントすると、ペイントツール(Paint Tool)でペイントした連続した線が徐々に暗くなります.これは、複数のマーカーペンを使用して画像に描画する効果と似ています.
カラーフィルタ(Screen)は、各チャネルのカラー情報を表示し、ブレンドカラーの相補的なカラーをベースカラーに重ねます.結果色は常に明るい色です.黒でフィルタリングしても色は変わりません.白で濾過すると白になります.この効果は、複数の撮影スライドが互いに投影されているのと似ています.
三、shader実現
リファレンスhttps://github.com/jamieowen/glsl-blend
例:
ノーマルハイブリッド方式
vec3 blendNormal(vec3 base, vec3 blend) {
return blend;
}
vec3 blendNormal(vec3 base, vec3 blend, float opacity) {
return (blendNormal(base, blend) * opacity + base * (1.0 - opacity));
}
Multiplyハイブリッド方式
vec3 blendMultiply(vec3 base, vec3 blend) {
return base*blend;
}
vec3 blendMultiply(vec3 base, vec3 blend, float opacity) {
return (blendMultiply(base, blend) * opacity + base * (1.0 - opacity));
}
Screenハイブリッド方式
float blendScreen(float base, float blend) {
return 1.0-((1.0-base)*(1.0-blend));
}
vec3 blendScreen(vec3 base, vec3 blend) {
return vec3(blendScreen(base.r,blend.r),blendScreen(base.g,blend.g),blendScreen(base.b,blend.b));
}
vec3 blendScreen(vec3 base, vec3 blend, float opacity) {
return (blendScreen(base, blend) * opacity + base * (1.0 - opacity));
}
四、その他の計算方法のリスト:
参照先:https://cloud.tencent.com/developer/article/1121722前置き説明:Tは混合後の画素色、Sは混合用の素材画素色、Dは下図の画素色(S,D,Tの取値範囲はいずれも0~1)を示す.
ブレンドモード(Blend Mode)
数式
条件
Normal
T=S
multiply
T=S*D
screen
T=1-(1-S)*(1-D)
overlay
T=2SD
D<0.5
T=1-2*(1-S)*(1-D)
D>=0.5
hardlight
T= 2*S*D
S<0.5
T=1-2*(1-S)*(1-D)
S>=0.5
softlight
T=2*S*D+D*D*(1-2*S)
S<0.5
T=2*D*(1-S)+sqrt(D)(2S-1)
S>=0.5
divide
T=D/S
D/Sは0~1の間をとる
add
T=D+S
D+Sは0~1の間をとる
subtract
T=D-S
D-Sは0~1の間をとる
diff
T=|D-S|
darken
T=MIN(D,S)
lighten
T=MAX(D,S)
融合画像が半透明の場合(α値は1ではありません)、融合後の画素値*T’=T*α+(1-α)D.から分かるようにα0の場合(全透明)、T’=D、すなわち融合画像は結果に影響しない.当α1の場合(不透明)、T’=T.