/** * Copyright(c) Live2D Inc. All rights reserved. * * Use of this source code is governed by the Live2D Open Software license * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ vec4 OverlapRgba(vec3 color, vec3 colorSource, vec3 colorDestination, vec3 parameter) { vec3 rgb = color * parameter.x + colorSource * parameter.y + colorDestination * parameter.z; float alpha = parameter.x + parameter.y + parameter.z; return vec4(rgb, alpha); } #if defined(ALPHA_BLEND_OVER) vec4 AlphaBlend(vec3 color, vec4 colorSource, vec4 colorDestination) { vec3 parameter = vec3(colorSource.a * colorDestination.a, colorSource.a * (1.0 - colorDestination.a), colorDestination.a * (1.0 - colorSource.a)); return OverlapRgba(color, colorSource.rgb, colorDestination.rgb, parameter); } #elif defined(ALPHA_BLEND_ATOP) vec4 AlphaBlend(vec3 color, vec4 colorSource, vec4 colorDestination) { vec3 parameter = vec3(colorSource.a * colorDestination.a, 0, colorDestination.a * (1.0 - colorSource.a)); return OverlapRgba(color, colorSource.rgb, colorDestination.rgb, parameter); } #elif defined(ALPHA_BLEND_OUT) vec4 AlphaBlend(vec3 color, vec4 colorSource, vec4 colorDestination) { vec3 parameter = vec3(0.0, 0.0, colorDestination.a * (1.0 - colorSource.a)); return OverlapRgba(color, colorSource.rgb, colorDestination.rgb, parameter); } #elif defined(ALPHA_BLEND_CONJOINTOVER) vec4 AlphaBlend(vec3 color, vec4 colorSource, vec4 colorDestination) { vec3 parameter = vec3(min(colorSource.a, colorDestination.a), max(colorSource.a - colorDestination.a, 0.0), max(colorDestination.a - colorSource.a, 0.0)); return OverlapRgba(color, colorSource.rgb, colorDestination.rgb, parameter); } #elif defined(ALPHA_BLEND_DISJOINTOVER) vec4 AlphaBlend(vec3 color, vec4 colorSource, vec4 colorDestination) { vec3 parameter = vec3(max(colorSource.a + colorDestination.a - 1.0, 0.0), min(colorSource.a, 1.0 - colorDestination.a), min(colorDestination.a, 1.0 - colorSource.a)); return OverlapRgba(color, colorSource.rgb, colorDestination.rgb, parameter); } #else #error not supported alpha blend function #endif