3Dmigoto学习笔记(5) dump全部内容
老样子,继续使用kena Bridge of Spirits来进行笔记记录,其它dx11游戏也是同样的原理。

在上一节中,我接触到了游戏内贴图资源的替换,我使用一个红色的贴图替换了模型的材质资源,改变了游戏角色的衣服整体颜色:

现在我想把角色的上衣部分改成红色,而其它地方颜色不变,这时候就需要用到dump了。
第一步:开启dump配置
在第二节的笔记中,我已经配置了dump的快捷键为F8:

现在我需要配置一下dump都导出哪些内容。

这一行analyse_option = 就是配置导出内容的地方,可以看到它默认处于关闭状态。
我解开它的注释,并将它的内容改为:
analyse_options =deferred_ctx_accurate dump_rt dump_tex dump_cb dump_vb dump_ib buf txt
这是我常用的配置,这里设置了导出render_target,texture_2D资源, constant buffer, vertex buffer ,index buffer的内容,导出的格式为buf和txt。
我设置好之后,保存并返回游戏,按F10重新加载d3dx.ini:

第二步:去除我之前打上的颜色替换mod
打开我的Mods文件夹,将上一节中的主角_衣服_变色文件夹重命名为DISABLED 主角_衣服_变色。

这里DISABLED用法的原理是3dmigoto会递归地扫描每个文件和文件夹,如果文件或文件夹的名称以DISABLED开头,则会跳过这个文件或文件夹的内容,所以我重命名后,相当于关闭了这个MOD。
进入游戏内按F10刷新,衣服变回了正常的颜色。

第三步:进行dump
所谓的dump,其实就是把游戏内当前场景下,加载到GPU执行的每一个资源,全部以顶点信息的格式导出,其中贴图UV类资源可以导出为.dds类型或.png类型,其它资源可以导出为.buf类型或.txt类型。
在上一步中,我配置的是导出当前场景下的全部资源,所以导出的文件会非常多且总量加起来非常大,少的话有2-5个G,多的话20-50个G,且导出的速度瓶颈取决于我的硬盘写入速度,这里如果我使用的是机械硬盘,则这节笔记内容不适用,进入下一节笔记,在下一节笔记中我会记录如何只导出我需要的部分资源。
如果我使用的是机械硬盘,则导出时花费的时间要比固态硬盘久的多,所以确保我拥有固态硬盘,再继续后面的操作。
我返回到游戏界面,按下小键盘的0开启Hunting:

接下来我按下F8来导出当前场景下的所有模型和资源,按下后游戏会卡顿很久,不用担心,这是正常现象,建议找一个游戏内场景比较简单的地方导出,场景越复杂,导出的资源越多,占用空间越大,消耗时间越久。
当然,如果游戏直接卡死了,那就去下一节笔记中寻找只导出部分资源的方法。
花费了大概1分钟的时间,导出了8个多G的数据。

第四步:查找衣服所用的PS地址
在之前的教程中,我已经学会了hunting的使用,所以我可以自己用Hunting找一下对应的PS地址。

这里我找到的地址是:a1422ca63e56d2d2
打开我dump出来的文件夹:

搜索这个PS地址,点击查看,大图标

随便一找就找到了对应的贴图:

可以看到贴图的名称含有ps-t3,我上一节中替换的也是ps-t3,所以在后续的资源替换中,可以使用dump的方式,来快速定位某个hash地址需要替换的层级,比如这里快速定位到它是ps-t3层级。
这里要说明一下,dump出来的资源有很多是重复的,比如这里一个贴图就出现了两次,我只要选用其中任意一个就行。
第五步:创建mod配置文件
首先我在Mods文件夹下面创建一个文件夹,把贴图复制过来,开始制作mod。

接下来创建一个配置文件:主角_衣服_部分变色.ini

将贴图文件改名为1.dds,方便使用,然后在配置文件中配置以下内容:

第六步:修改dds贴图
我使用paint.net打开dds贴图,并修改衣服对应部位的颜色为红色,这一步通常使用着色器工具:

一顿操作之后,衣服全部涂成红色了:

这里要注意,按Ctrl + S保存后,要选择BC7 (sRGB, DX11+),其它选项可能会导致颜色显示不正确。
第七步:进入游戏查看效果
返回到游戏,按F10重新加载:

可以看到,人物的衣服部分颜色变成了红色。
也可以使用高超的PS技术,给人物衣服绘制各种图案,制作个性mod。
大功告成!
在本节笔记中记录了如何替换人物细节贴图的颜色,而不是整体全部替换。
在这一节内容中,我配置的dump是导出当前场景下所有物体,对于机器配置较低的小伙伴不是很友好,而且这种方式进行导出后,我实际上用到的只有一张图片,非常浪费资源,为了解决这个问题,我将在下一节中配置部分导出。
比如只导出角色衣服相关的资源,这样可以大大减少导出所需的时间,也能大大减少磁盘所需的空间。