- m2_material: Metin2-style ShaderMaterial. blend_mix shader (opaque /
alpha-blend / alpha-test-cutout via `mode` uniform) + blend_add shader
(additive glow). modulate(tex, COORD) * COLOR, diffuse_lambert.
- Metin2Model: material_mode prop ("metin2" ShaderMaterial | "standard");
_resolve_texture does filename-convention + case-insensitive dir scan of
*.dds (face/hair keyword slots, stem match, fallback); set_surface_texture
override; guess_blend heuristic (hair->cutout, cape->alpha, effect->add).
Texture cache. Fixed opaque path to NOT alpha-discard (was hiding bodies).
- harness: AABB-based camera framing, engine depth fog (MTGODOT_FOG=1),
MTGODOT_ANIM_T fixed-pose capture (needs explicit anim reload first),
MTGODOT_AUTOSHOT batch screenshot.
Verified: warrior 5/5 surfaces textured under the shader (t=9 dance pose,
lit, fogged). assassin 17/17 textured via dir scan. shaman_lord (gr2 v7)
renders. Screenshots test/golden/m25-*.png, m2c-t*.png.
Gap (M2.5 gate not closed): libgr2 POD API exposes no material/texture-name/
blend data, so multi-slot -> texture/blend mapping is heuristic only. Needs
a libgr2 material API (gr2_material.cpp walking the type tree) — same gap as
xrender-poc M1 T5. Documented in docs/GODOT-POC-PLAN.md §M2.5 T2.5.6.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaHYEY9rwLWt21PULiYjeJ
5.2 KiB
mtgodot-poc
「Godot 4 + 自研资源 loader」跨平台方案的渲染 Demo(route ①)。
用一个 C++ GDExtension 复用 xrender-poc 的 libgr2,把 Metin2 的
.gr2 骨骼资源渲染进 Godot,用 Godot 内置渲染器。
与 xrender-poc(自研引擎 + bgfx RHI)是两条并行的跨平台基座候选,共用 libgr2。
判定分两阶段:
| 阶段 | 平台 | 里程碑 | 产出 |
|---|---|---|---|
| Phase 1(当前) | macOS | M0' · M1 · M2 · M2.5 | 中期评审(不下 go/no-go) |
| Phase 2 | iOS · Android | M3 | go / no-go |
完整计划见 docs/GODOT-POC-PLAN.md。
现状
- M0' — 脚手架。GDExtension 加载 +
Metin2Model注册 +libgr2链接可调用- Godot 4.7 工程经 Metal Forward+ 出画。T0.4 实际
export待装 4.7.1 导出模板。
- Godot 4.7 工程经 Metal Forward+ 出画。T0.4 实际
- M1 — 静态渲染。
gr2→Skeleton3D+ArrayMesh+Skin+ 材质。warrior_cheongrin(75 骨 / 5 表面 / 3324 顶点)正立、朝 +Z、贴图正确 (test/golden/m1-bindpose.png)。多骨架:warrior_lord(v6,74)、assassin(v6,95,17 表面)、shaman_lord(v7,93) 均正确加载渲染。 - M2 — 骨骼动画。
Metin2AnimPlayer_process里gr2::sample_pose(跨文件) →Skeleton3D.set_bone_global_pose,Godot GPU 蒙皮。dance01(28.3s / 74 track) 播放,selfcheck25 采样 0 NaN,t=2/9/16/23 姿势各异(test/golden/m2c-*.png)。 - [~] M2.5 — 材质与观感保真。
ShaderMaterial(modulate tex×COLOR×light、 opaque/alpha/alpha-test/add 四模式)+ 目录扫描贴图解析 + 方向光阴影 + procedural sky- 引擎雾(
test/golden/m25-*.png)。门禁未闭:多材质槽 → 贴图/混合的精确映射需 给 libgr2 加材质 API(见docs/GODOT-POC-PLAN.md§M2.5 T2.5.6 差距清单)。
- 引擎雾(
- 中期评审 — 待 M2.5 门禁 + 对拍报告
对拍(与 xrender-poc bgfx demo / oracle 逐帧)尚未接线,是中期评审前的下一步。
环境
| 组件 | 版本 / 位置 | 说明 |
|---|---|---|
| Godot | 4.7.1(/opt/homebrew/bin/godot,Homebrew cask) |
编辑器 + headless |
| godot-cpp | submodule extension/godot-cpp @ master(pin 101ae38) |
master 默认 targets Godot 4.7 API(GODOTCPP_DEFAULT_API_VERSION=4.7);无 4.6/4.7 分支,只有 bundled extension_api-4-7.json |
| Xcode | 26.4.1 | macOS 构建 |
| CMake | 已装;不需要 SCons | godot-cpp 走 CMake 路径 |
| libgr2 | ../xrender-poc/libgr2(sibling-dir 引用) |
见下「libgr2 依赖」 |
导出模板(M0' T0.4 / 真正 export 才需要):编辑器内 Editor → Manage Export Templates → Download,或 godot --headless --install-export-templates。~600MB,版本须与编辑器一致(4.7.1)。
构建
git submodule update --init --recursive # 拉 godot-cpp(首次)
./build.sh # Debug;产物 → project/bin/libmtgodot.macos.template_debug.dylib
./build.sh Release # template_release
首次会编译 godot-cpp(几分钟)。
运行
# 编辑器打开
godot -e --path project
# headless 冒烟测试(验证 GDExtension 加载 + 类注册)
godot --headless --path project --quit-after 3
# 跑一个真实 gr2 过 libgr2(可选)
MTGODOT_PROBE_GR2="$PWD/../m2dev-client-main/assets/PC/ymir work/pc/warrior/warrior_cheongrin.gr2" \
godot --headless --path project --quit-after 3
控制台出现 [mtgodot] Metin2Model registered OK — libgr2 linked; ... = M0' 的 T0.1/T0.2 通过。
窗口内:拖拽 = 轨道,滚轮 = 缩放,F2 = 截图(→ user://)。
libgr2 依赖
M0' 直接用 sibling-directory 引用:extension/CMakeLists.txt 里
XRENDER_POC_DIR 默认 ../../xrender-poc,add_subdirectory 进 libgr2。
两个 repo 都在 .../mt/ 下时开箱即用。
换机 / CI 时二选一:
git submodule add <xrender-poc url> third_party/xrender-poc后传-DXRENDER_POC_DIR=third_party/xrender-poc- vendor 一份
libgr2/进本仓库
formats/(msa/msm)到 M2 才需要,届时同样方式接入。
目录
mtgodot-poc/
CMakeLists.txt 顶层(macOS only 守卫)
build.sh 便捷构建
extension/
CMakeLists.txt mtgodot SHARED + godot-cpp + libgr2
godot-cpp/ submodule @ master
src/
register_types.{h,cpp} GDExtension 入口,注册 Metin2Model
metin2_model.{h,cpp} M0' 占位节点(证明类注册 + libgr2 链接)
project/ Godot 4.7 工程
project.godot
main.tscn 根 Node3D + main.gd
main.gd M0' harness:建 env/light/cam/cube + 探测扩展
assets/.gdignore 让 Godot 不 import .gr2/.dds
bin/mtgodot.gdextension 扩展描述符(dylib 构建产物落这里)
export_presets.cfg macOS preset
docs/
GODOT-POC-PLAN.md 开发计划(M0'–M4 + 风险 + 验收)
steps/ (按需)
test/golden/ 对拍截图(M1 起)
授权
libgr2 全自研,不含 Granny SDK 代码。本仓库内部研究用途,不对外公开。