本文记录发布时的实现与测量。文中的版本号、费用和检查数量属于该阶段;后续兵种安装记录见吸血鬼交付,现行工具入口见独立仓库

一个我一直在按原版规格干活、却没意识到可以跳出去的地方:我们不必只渲 79 像素高。

英雄无敌 3 的兵种被 1999 年那一次预渲染锁死了——游戏里有的就是那个分辨率的产物, 再多没有了。而我们每一帧都是现渲的,分辨率只是个参数

引擎侧早就准备好了

VCMI 有按倍率分的素材树,Sprites2x/Sprites3x/Sprites4x/ 就在 Sprites/ 旁边。 开了放大滤镜,引擎优先用预制的高清版,只有缺的才回退到 xBRZ 算法放大。

这个能力我在第二篇里就写过,当时把它当成一条约束 记下来(各倍率必须共用 basepath 和文件名),没意识到它其实是个出口。

实测

--scale 把画布、地面线、生物高度一起等比放大,所以锚点保持正确:

1x    450x400      地面线  267    生物  79px
2x    900x800      地面线  534    生物 158px
4x   1800x1600     地面线 1068    生物 316px
原版放大、4x 原生渲染、我们的 1x 放大
左:原版 1x 放大四倍。中:我们的 4x 原生渲染。右:同一模型的 1x 放大四倍。

中间那张能看清肋骨、指骨、脚趾和剑刃的形状。左右两张是同一个信息量被拉伸—— 一个是原版的马赛克,一个是我们自己 1x 的糊。

多出来的不是插值猜出来的细节,是本来就在模型里、只是之前没渲出来的细节。

代价

渲染时间随倍率平方增长。 2x 的像素量是 1x 的四倍,全套十三组渲下来明显更久—— 中途还因为内存不足被系统杀了一次进程。4x 是十六倍。

体积也一样。 一个兵种 1x 大约 12 MB,2x 四十多 MB。一百五十个兵种全做到 4x 就是 几十 GB,所以 VCMI 的 HD 指南建议提供 2x 和 3x 而不是 4x。

一个容易忽略的细节

各倍率的动画 JSON 必须用相同的 basepath 和文件名,只有目录不同——引擎解析 basepath 时是相对倍率前缀的。写成 creatures/cskele/holding_00.png 在两棵树里都对,写成 creatures/cskele/2x/holding_00.png 就错了。

另外 1x 那套仍然必须提供:高清树只在放大滤镜开启时才被查。

代码在 PR #10

工具在 h3-art-pipeline 维护;模型和完整 mod 留在本地。工具迁移与复现

历史记录

历史原文与修订记录(展开阅读)

以下完整保留本次整理前的原文、图片和删除线。这里的“当前”“尚未完成”和“下一步”均指各段写作或标注时的状态;旧版本号、旧工具路径与试稿不能作为现行操作说明。

2026-09-09 工具迁移: 后续代码在 h3-art-pipeline 维护,原 tools/creature-art/tools/town-art/ 对应新仓库的 creature-art/town-art/。本文的旧路径和 PR 链接保留作历史记录。迁移与复现说明

一个我一直在按原版规格干活、却没意识到可以跳出去的地方:我们不必只渲 79 像素高。

英雄无敌 3 的兵种被 1999 年那一次预渲染锁死了——游戏里有的就是那个分辨率的产物, 再多没有了。而我们每一帧都是现渲的,分辨率只是个参数

引擎侧早就准备好了

VCMI 有按倍率分的素材树,Sprites2x/Sprites3x/Sprites4x/ 就在 Sprites/ 旁边。 开了放大滤镜,引擎优先用预制的高清版,只有缺的才回退到 xBRZ 算法放大。

这个能力我在第二篇里就写过,当时把它当成一条约束 记下来(各倍率必须共用 basepath 和文件名),没意识到它其实是个出口。

实测

--scale 把画布、地面线、生物高度一起等比放大,所以锚点保持正确:

1x    450x400      地面线  267    生物  79px
2x    900x800      地面线  534    生物 158px
4x   1800x1600     地面线 1068    生物 316px
原版放大、4x 原生渲染、我们的 1x 放大
左:原版 1x 放大四倍。中:我们的 4x 原生渲染。右:同一模型的 1x 放大四倍。

中间那张能看清肋骨、指骨、脚趾和剑刃的形状。左右两张是同一个信息量被拉伸—— 一个是原版的马赛克,一个是我们自己 1x 的糊。

多出来的不是插值猜出来的细节,是本来就在模型里、只是之前没渲出来的细节。

代价

渲染时间随倍率平方增长。 2x 的像素量是 1x 的四倍,全套十三组渲下来明显更久—— 中途还因为内存不足被系统杀了一次进程。4x 是十六倍。

体积也一样。 一个兵种 1x 大约 12 MB,2x 四十多 MB。一百五十个兵种全做到 4x 就是 几十 GB,所以 VCMI 的 HD 指南建议提供 2x 和 3x 而不是 4x。

一个容易忽略的细节

各倍率的动画 JSON 必须用相同的 basepath 和文件名,只有目录不同——引擎解析 basepath 时是相对倍率前缀的。写成 creatures/cskele/holding_00.png 在两棵树里都对,写成 creatures/cskele/2x/holding_00.png 就错了。

另外 1x 那套仍然必须提供:高清树只在放大滤镜开启时才被查。

代码在 PR #10