|
@@ -536,10 +536,25 @@ vec4 add_over(vec4 colora, vec4 colorb){
|
|
|
#endif
|
|
#endif
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
+vec4 multiply_over(vec4 colora, vec4 colorb){
|
|
|
|
|
+#ifndef OUR_STRAIGHT_ALPHA
|
|
|
|
|
+ colora=(colora.a>0.)?vec4(colora.rgb/colora.a,colora.a):vec4(0.,0.,0.,0.);
|
|
|
|
|
+ colorb=(colorb.a>0.)?vec4(colorb.rgb/colorb.a,colorb.a):vec4(0.,0.,0.,0.);
|
|
|
|
|
+#endif
|
|
|
|
|
+ float afac=colora.a*uAlphaTop/uAlphaBottom;
|
|
|
|
|
+ vec4 result=vec4(mix(colorb.rgb,colora.rgb*colorb.rgb,afac),colorb.a);
|
|
|
|
|
+#ifndef OUR_STRAIGHT_ALPHA
|
|
|
|
|
+ result=vec4(result.rgb*result.a,result.a);
|
|
|
|
|
+#endif
|
|
|
|
|
+ return result;
|
|
|
|
|
+}
|
|
|
void main() {
|
|
void main() {
|
|
|
ivec2 px=ivec2(gl_GlobalInvocationID.xy);
|
|
ivec2 px=ivec2(gl_GlobalInvocationID.xy);
|
|
|
vec4 c1=OurImageLoad(top,px); vec4 c2=OurImageLoad(bottom,px);
|
|
vec4 c1=OurImageLoad(top,px); vec4 c2=OurImageLoad(bottom,px);
|
|
|
- vec4 c=(uBlendMode==0)?mix_over(c1,c2):add_over(c1,c2);
|
|
|
|
|
|
|
+ vec4 c=vec4(0.,0.,0.,0.);
|
|
|
|
|
+ if(uBlendMode==0) c=mix_over(c1,c2);
|
|
|
|
|
+ else if(uBlendMode==1) c=add_over(c1,c2);
|
|
|
|
|
+ else if(uBlendMode==2) c=multiply_over(c1,c2);
|
|
|
OurImageStore(bottom,px,c);
|
|
OurImageStore(bottom,px,c);
|
|
|
//OurImageStore(top,px,vec4(1.));
|
|
//OurImageStore(top,px,vec4(1.));
|
|
|
}
|
|
}
|