包含三个子项目: - avatar-h5-renderer: Live2D Cubism 4 H5 渲染器 (Vite + TS) - avatar_flutter_app: Flutter 容器 App (打包 H5 进 WebView) - gif-export: puppeteer 导出 32 个动作的透明 GIF (供 ESP32 圆屏播放) 模型资源: Haru, Natori (含贴图、moc3、motions, expressions) 设计文档: AI驱动虚拟形象渲染方案_v5.1.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
68 lines
2.0 KiB
GLSL
68 lines
2.0 KiB
GLSL
/**
|
|
* 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.
|
|
*/
|
|
|
|
|
|
varying vec2 v_texCoord; //v2f.texcoord
|
|
varying vec2 v_blendCoord;
|
|
varying vec4 v_clipPos;
|
|
uniform sampler2D s_texture0; //_MainTex
|
|
uniform sampler2D s_blendTexture;
|
|
uniform vec4 u_baseColor; //v2f.color
|
|
uniform vec4 u_multiplyColor;
|
|
uniform vec4 u_screenColor;
|
|
uniform sampler2D s_texture1; // _ClippingMaskTex
|
|
uniform float u_invertClippingMask;
|
|
uniform vec4 u_channelFlag;
|
|
|
|
vec3 ColorBlend(vec3 colorSource, vec3 colorDestination);
|
|
vec4 AlphaBlend(vec3 C, vec3 Cs, float As, vec3 Cd, float Ad);
|
|
|
|
void main()
|
|
{
|
|
vec4 renderTextureColor = texture2D(s_blendTexture, v_blendCoord);
|
|
vec3 colorDestination = renderTextureColor.rgb;
|
|
float alphaDestination = renderTextureColor.a;
|
|
|
|
if (alphaDestination < 0.00001)
|
|
{
|
|
colorDestination = vec3(0.0, 0.0, 0.0);
|
|
}
|
|
else {
|
|
colorDestination /= alphaDestination;
|
|
}
|
|
|
|
vec4 texColor = texture2D(s_texture0, v_texCoord);
|
|
texColor.rgb *= u_multiplyColor.rgb;
|
|
texColor.rgb = (texColor.rgb + u_screenColor.rgb) - (texColor.rgb * u_screenColor.rgb);
|
|
|
|
texColor *= u_baseColor;
|
|
vec3 colorSource = texColor.rgb;
|
|
float alphaSource = texColor.a;
|
|
|
|
if (alphaSource < 0.00001)
|
|
{
|
|
colorSource = vec3(0.0, 0.0, 0.0);
|
|
}
|
|
else {
|
|
colorSource /= alphaSource;
|
|
}
|
|
|
|
#ifdef CLIPPING_MASK
|
|
float maskVal = 1.0;
|
|
vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;
|
|
maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;
|
|
maskVal = abs(u_invertClippingMask - maskVal);
|
|
|
|
alphaSource *= maskVal;
|
|
#endif
|
|
|
|
vec4 source = vec4(colorSource.r, colorSource.g, colorSource.b, alphaSource);
|
|
vec4 destination = vec4(colorDestination.r, colorDestination.g, colorDestination.b, alphaDestination);
|
|
|
|
gl_FragColor = AlphaBlend(ColorBlend(colorSource, colorDestination), source, destination);
|
|
}
|