开始菜单、玩家选择、脸部绘制

This commit is contained in:
2026-10-02 12:06:28 +08:00
parent fbf00cf11f
commit 698cb02c21
26 changed files with 1419 additions and 21 deletions
+29
View File
@@ -0,0 +1,29 @@
shader_type spatial;
// 面部 = 两层贴图的合成:底图(预设脸)+ 笔画层(玩家自绘),后者带 alpha 盖在前面。
// 两层都用「面部孤岛重映射后的 UV」采样,所以一张方形小图就能正好铺满整张脸。
//
// 为什么不是直接把贴图换掉:画布只装笔画、不装底图,橡皮擦掉笔画后露出来的是预设脸,
// 而不是把脸擦成黑洞。这也是它能一边切预设一边保留手绘笔画的原因。
// 面部 UV 孤岛(实测自 mouse.glb 的 body_mesh surface 1 "face"):
// u 0.142~0.356,v 0.038~0.238。v 往下外扩到 0.031 是为了取成正方形,避免拉伸。
uniform vec2 face_uv_min = vec2(0.142, 0.031);
uniform float face_uv_size : hint_range(0.01, 1.0) = 0.214;
// 预设脸。没接上时给张白图,至少不会一片黑
uniform sampler2D base_tex : source_color, filter_linear, repeat_disable,
hint_default_white;
// 玩家笔画层(一个透明底的 SubViewport)。没接上时给张全透明图,等于没画
uniform sampler2D paint_tex : source_color, filter_linear, repeat_disable,
hint_default_transparent;
void fragment() {
vec2 uv = (UV - face_uv_min) / face_uv_size;
vec4 base = texture(base_tex, uv);
vec4 paint = texture(paint_tex, uv);
ALBEDO = mix(base.rgb, paint.rgb, paint.a);
// 顶掉 GLB 里 lambert1 那套手感,不然脸会比身体亮一块
ROUGHNESS = 1.0;
METALLIC = 0.0;
}