阶段性合并:动画重定向、碎裂共享库、第三人称玩法、编辑器面板与 vendored ufbx
- 动画:HumanoidRig 三层架构(standard 标准槽 / dialects 方言映射 / mapper 配对), 指/趾统一走世界增量两遍式烘焙;AnimationAttach 拆为纯算法 + facade;修正 HumanoidBasis 行走基朝向与跨骨架去重、根运动通道 - 物理:CharacterController 角色互碰撞 / shapeOffset / 接触事件;PhysicsWorld 接触合成与 字符冲量判定 - 渲染与材质:Model 多材质按材质拆子 mesh 与贴图路径解析、DDS 直传、GLB 内嵌纹理落盘、 不透明通道 alpha 固定 1.0、glTF FlipUVs 对齐;SceneSerializer 支持 meshIndex 与材质覆盖 - 脚本:FractureLib 抽为共享库(HostView 桥接)、WallFracture 参数直绑、新增 ThirdPersonCamera / Follower / WASDMove 玩法;移除 GameDirector / PlayerController / Target - 编辑器:新增 GamepadPanel、LogPanel(LogRing),改进 Inspector / 材质 / 统计 / 视口面板 - 依赖:vendored ufbx(FBX 5.x/6.x/7.x 全版本解析,替代 assimp 对 FBX 6.1 的拒读)
This commit is contained in:
@@ -45,19 +45,25 @@ layout(set = 1, binding = 6) uniform MaterialParams {
|
||||
vec4 factors; // x = metallic 因子,y = roughness 因子,z = 独立粗糙度图开关,w = MASK 镂空开关
|
||||
vec4 baseColor; // glTF baseColorFactor:rgb 调色 albedo,a = BLEND 透明度
|
||||
vec4 surface; // x = ior(F0 换算),y = transmission(不透明段恒 0 语义),z = 自发光强度,w = 体积厚度
|
||||
vec4 misc; // x = unlit(KHR_materials_unlit,1 = 早退直出 albedo)
|
||||
vec4 misc; // x = unlit(KHR_materials_unlit,1 = 早退直出 albedo),y = UV 左右镜像,z = UV 上下镜像
|
||||
vec4 emissiveFactor; // 自发光颜色(rgb × emissiveMap × surface.z;黑 = 不发光)
|
||||
vec4 uvA[6]; // 每槽 UV 线性变换(KHR_texture_transform,v-up 空间)(a11,a12,a21,a22),槽序 = binding
|
||||
vec4 uvT[6]; // 每槽 UV 平移 (tx, ty, 0, 0)
|
||||
vec4 alphaOverlay; // rgb = albedo alpha 叠加色,a = 强度(0 = 关闭)
|
||||
} matParams;
|
||||
|
||||
// 每槽 UV 变换:uv' = A·uv + t(identity 时退化为直通)。slot 必须
|
||||
// 字面量调用点(编译期展开索引);6 = Material::kSlotCount
|
||||
// 末尾叠加材质级镜像(misc.y = 左右,misc.z = 上下),作用全部槽:
|
||||
// 纠正源资产 UV 朝向(部分角色 rip 与 glTF 上左原点约定相反)
|
||||
vec2 ApplyUv(int slot, vec2 uv) {
|
||||
vec4 a = matParams.uvA[slot];
|
||||
vec4 t = matParams.uvT[slot];
|
||||
return vec2(a.x * uv.x + a.y * uv.y + t.x,
|
||||
a.z * uv.x + a.w * uv.y + t.y);
|
||||
vec2 o = vec2(a.x * uv.x + a.y * uv.y + t.x,
|
||||
a.z * uv.x + a.w * uv.y + t.y);
|
||||
if (matParams.misc.y > 0.5) o.x = 1.0 - o.x;
|
||||
if (matParams.misc.z > 0.5) o.y = 1.0 - o.y;
|
||||
return o;
|
||||
}
|
||||
|
||||
// CSM 阴影(sampler2DShadow:单次采样 = 硬件 2×2 深度比较 PCF)
|
||||
@@ -154,9 +160,13 @@ void main() {
|
||||
// alphaMode=MASK 镂空(表针/栅栏等硬边贴图):低于阈值的纹素直接丢弃
|
||||
if (matParams.factors.w > 0.5 && albedoTex.a < 0.5) discard;
|
||||
vec3 albedo = albedoTex.rgb * matParams.baseColor.rgb;
|
||||
// albedo 贴图 alpha 作细节叠加遮罩(脸部腮红/卧蚕等局部效果):
|
||||
// 强度 0 = mix 恒等,无副作用
|
||||
albedo = mix(albedo, matParams.alphaOverlay.rgb,
|
||||
albedoTex.a * matParams.alphaOverlay.a);
|
||||
// KHR_materials_unlit:无光照语义(文字标签/示意图),albedo 直出
|
||||
if (matParams.misc.x > 0.5) {
|
||||
outColor = vec4(albedo, albedoTex.a * matParams.baseColor.a);
|
||||
outColor = vec4(albedo, 1.0);
|
||||
outVelocity = fragVelocity;
|
||||
return;
|
||||
}
|
||||
@@ -259,9 +269,11 @@ void main() {
|
||||
vec3 ambient = (diffuse + specular) * ubo.ambientColor.rgb
|
||||
* mix(0.4, 1.0, shade0); // 阴影区环境同步衰减(简化遮蔽)
|
||||
|
||||
// alpha = albedo 贴图覆盖率 × baseColorFactor.a(glTF alphaMode=BLEND
|
||||
// 混合源);不透明资产两者恒 1 行为不变。预乘在 tonemap 段完成。
|
||||
outColor = vec4(ambient + Lo + emissive, albedoTex.a * matParams.baseColor.a);
|
||||
// 不透明段覆盖率恒 1:本 pass 只画 alphaMode=OPAQUE/MASK 表面,像素必
|
||||
// 被完全覆盖。绝不能拿 albedo 贴图 alpha 当覆盖率——HI3/Genshin 脸部
|
||||
// 贴图的 alpha 是腮红/卧蚕遮罩(大面积 0),写进 HDR.a 后会被 tonemap
|
||||
// 的预乘 (rgb * a) 拉成纯黑。贴图 alpha 的细节用法见 alphaOverlay。
|
||||
outColor = vec4(ambient + Lo + emissive, 1.0);
|
||||
// ==== DEBUG B1: 纯 albedo 直出(验证贴图绑定/UV 采样)====
|
||||
// outColor = vec4(albedo, 1.0);
|
||||
outVelocity = fragVelocity;
|
||||
|
||||
@@ -45,18 +45,23 @@ layout(set = 1, binding = 6) uniform MaterialParams {
|
||||
vec4 factors; // x = metallic 因子,y = roughness 因子,z = 独立粗糙度图开关,w = MASK 镂空开关
|
||||
vec4 baseColor; // glTF baseColorFactor:rgb 调色 albedo,a = BLEND 透明度
|
||||
vec4 surface; // x = ior,y = transmission(KHR_materials_transmission),z = 自发光强度,w = 体积厚度
|
||||
vec4 misc; // x = unlit(透射材质不会是 unlit,仅为与 simple_shader 布局一致)
|
||||
vec4 misc; // x = unlit(透射材质不会是 unlit,仅为与 simple_shader 布局一致),y = UV 左右镜像,z = UV 上下镜像
|
||||
vec4 emissiveFactor; // 自发光颜色(rgb × emissiveMap × surface.z;黑 = 不发光)
|
||||
vec4 uvA[6]; // 每槽 UV 线性变换(KHR_texture_transform,v-up 空间)(a11,a12,a21,a22),槽序 = binding
|
||||
vec4 uvT[6]; // 每槽 UV 平移 (tx, ty, 0, 0)
|
||||
vec4 alphaOverlay; // rgb = albedo alpha 叠加色,a = 强度(0 = 关闭)
|
||||
} matParams;
|
||||
|
||||
// 每槽 UV 变换:uv' = A·uv + t(与 simple_shader.frag 同款,6 = kSlotCount)
|
||||
// 末尾叠加材质级镜像(misc.y = 左右,misc.z = 上下),作用全部槽
|
||||
vec2 ApplyUv(int slot, vec2 uv) {
|
||||
vec4 a = matParams.uvA[slot];
|
||||
vec4 t = matParams.uvT[slot];
|
||||
return vec2(a.x * uv.x + a.y * uv.y + t.x,
|
||||
a.z * uv.x + a.w * uv.y + t.y);
|
||||
vec2 o = vec2(a.x * uv.x + a.y * uv.y + t.x,
|
||||
a.z * uv.x + a.w * uv.y + t.y);
|
||||
if (matParams.misc.y > 0.5) o.x = 1.0 - o.x;
|
||||
if (matParams.misc.z > 0.5) o.y = 1.0 - o.y;
|
||||
return o;
|
||||
}
|
||||
|
||||
// CSM 阴影(sampler2DShadow:单次采样 = 硬件 2×2 深度比较 PCF)
|
||||
@@ -152,6 +157,9 @@ vec3 FresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) {
|
||||
void main() {
|
||||
vec4 albedoTex = texture(albedoMap, ApplyUv(0, fragUV));
|
||||
vec3 albedo = albedoTex.rgb * matParams.baseColor.rgb;
|
||||
// albedo 贴图 alpha 作细节叠加遮罩(与 simple_shader 同款,0 = 恒等)
|
||||
albedo = mix(albedo, matParams.alphaOverlay.rgb,
|
||||
albedoTex.a * matParams.alphaOverlay.a);
|
||||
vec4 mr = texture(metallicRoughnessMap, ApplyUv(2, fragUV));
|
||||
// 粗糙度源按 factors.z 切换:glTF 合图工作流读 MR.g;
|
||||
// FBX/OBJ specular 工作流(z=1)换用独立粗糙度图 R 通道
|
||||
|
||||
Reference in New Issue
Block a user