因为二游这种游戏,有经常版本更新的属性。
每次更新都可能带来预想不到的变化,所以mod并不是每个版本都通用的,但是不用担心,大多数情况下,游戏更新几天后会有社区大手子提供修复工具,到时候按照对应说明使用修复工具,就可以把mod更新到最新版本啦。
在大多数情况下, Mod 失效无非以下几种情况:
槽位发生改变
打开 .ini 文件, 通常会看到形如
[TextureOverrideIBIBIBIB]
hash = IBIBIBIB
match_first_index = 0
ps-t0 = ResourceIBIBIBIBSomeMapA
ps-t1 = ResourceIBIBIBIBSomeMapB
ps-t2 = ResourceIBIBIBIBSomeMapC
ib = ResourceIBIBIBIBIndexBuffer
drawindexed = nunmber0,number1,number2
的段落, 其中的 ps-tx 即该索引缓冲区 (Index Buffer) 所绑定的第 x 个像素着色器层 (Pixel Shader Tier), 每一层使用一个贴图资源, 在这里即通过
ps-tx = ResourceSomeSeciton
引用, 而后在他处指定资源文件相对路径:
[ResourceSomeSection]
filename = .\Textures\ThisTexture.dds
游戏更新后, 已有的槽位可能会发生改动, 通常而言, 绑定槽位贴图资源后, 配置文件会调用 ORFix 来正确配置贴图:
[TextureOverrideIBIBIBIB]
hash = IBIBIBIB
match_first_index = 0
ps-t0 = ResourceIBIBIBIBSomeMapA
ps-t1 = ResourceIBIBIBIBSomeMapB
ps-t2 = ResourceIBIBIBIBSomeMapC
run = CommandList\Global\ORFix\ORFix.ini ; <<--- 这里!
ib = ResourceIBIBIBIBIndexBuffer
drawindexed = nunmber0,number1,number2
但 ORFix 本身是工具包每个版本维护的库, 自然会有更新不及时的情况. 那么此时就束手无策了吗? 实际上有两种解决方案:
- 尝试更改像素着色器层
比如说将 0, 1, 2 的顺序改为 1, 2, 0:
; ...
ps-t1 = ResourceIBIBIBIBSomeMapA
ps-t2 = ResourceIBIBIBIBSomeMapB
ps-t0 = ResourceIBIBIBIBSomeMapC
; ...
不一定能够完全修好, 不过总归是 ORFix 更新前一种方案.
- 手动配置, 改为通过贴图资源哈希锚定
这就需要有一定的 Mod 制作小知识了, 相对而言稍微麻烦一些.
3DMigoto 修改贴图, 常见的有两种方式 (不常见的不考虑).
(1). 一种就是上面所说的, 通过像素着色器层锚定, 这种方法能够确保模型在任何 LOD (Level of Detail, 细节层次) 下, 无论原本使用什么精度的贴图, 都转而使用我们修改后的贴图, 但问题是, 模型在不同上下文 (e.g. 水中、镜中)、不同游戏版本可能使用着不同的像素着色器层组合方式, 一旦与我们设定组合方式的不同, 模型就会采用错误的贴图 (e.g. 以 LightMap 为 DiffuseMap, 变绿; 以 NormalMap 为 DiffuseMap, 变紫/变黄);
(2). 另一种是通过贴图资源哈希锚定, 我们可以获取贴图本身的哈希去锚定、修改:
[TextureOverrideHashHash]
hash = HashHash
this = ResourceHashHash
这种方式的优点是, 能够确定地修改渲染所需的贴图资源, 而无需在意其处于什么像素着色器层、被谁使用, 只要贴图本身的内容不变, 其哈希就是稳定的; 而缺点同样也很明显: 一是无法精确控制特定 Submesh 的像素着色器层, 也无法实现分 drawindexed 指定贴图; 对低精度的 LOD, 模型采用的贴图压根不是我们锚定的资源. 也有解决方法, 即, 获取其他 LOD 层的贴图资源哈希, 一并锚定.
如何获取呢? XXMI 不清楚, 不过 SSMT 可以查看 SSMT 的模组制作教程, 其中在后处理界面即可看到对应的贴图资源哈希:
模型哈希改变
分修复难度, 依次为:
索引缓冲区哈希改变
用 Dev 版本的 d3d11.dll 挂载游戏, 然后在希望修正的模型所在页面 (例如: 角色图鉴页面) 按下 NUMPAD0 打开 Hunting 模式, 然后用 NUMPAD7 和 NUMPAD8 查询目标模型的索引缓冲区 (Index Buffer) 哈希, 直到目标模型被隐藏, 此时按下 NUMPAD9 即可复制当前哈希值.随后打开 .ini 文件填入对应的 TextureOverride 节即可. (通常有 2~4 个, 因为单个索引缓冲区的子网格组通常有 1~3 个)
顶点缓冲区哈希改变
同上, 不过这次以 NUMPAD/, NUMPAD*, NUMPAD- 查找顶点缓冲区 (Vertex Buffer) 哈希. 随后填入对应的 TextureOverrideVertexLimitRaise 节即可. (通常仅一个)
Blend, Texcoord, Position 哈希改变
这个比较麻烦, 需要完整提取出游戏的原模型资源, 然后打开 (以 SSMT 为例) SSMT4CachedFolder\WorkSpace\GameItem\WorkspaceItem\LOD0\TargetIndexbufferTargetSubmeshOrComponent\TargetDataType, 阅读其中的 .json 配置文件, 即可获知正确的 Blend、Texcoord、Position 哈希, 如:
{
"GamePreset": "GIMI",
"VertexLimitVB": "c82fb483",
"CategoryHash": {
"Blend": "0ea973a0", // <-- Blend
"Position": "1ef5195e", // <-- Position
"Texcoord": "b7399f02" // <-- Texcoord
},
"CategoryDrawCategoryMap": {
"Blend": "Blend",
"Position": "Position",
"Texcoord": "Texcoord"
},
//...
填写至有问题的 Mod 的 .ini 文件对应区域, 例如
;MARK:TextureOverrideVB
; bf1830b6
[TextureOverride_VB_bf1830b6_身体_Position]
hash = 1ef5195e ; <-- 这里!
vb0 = Resourcebf1830b6Position
$active0 = 1
[TextureOverride_VB_bf1830b6_身体_Texcoord]
hash = b7399f02 ; <-- 这里!
vb1 = Resourcebf1830b6Texcoord
[TextureOverride_VB_bf1830b6_身体_Blend]
hash = 0ea973a0 ; <-- 这里!
vb1 = Resourcebf1830b6Blend
handling = skip
draw = 93444, 0
顶点组改变
这个相当麻烦, 需要熟悉完整的 Mod 制作流程, 自行逆向 Mod 模型、完整导出 Mod 才能自行修复, 希望了解还是推荐去看 SSMT 的官方教程文档. 不过如果只是希望游玩, 这些流程就过重了, 最好的方案还是等待社区提供的脚本化修复工具.
![]()
![]()
![]()
全是表情包说是.
测试一下公式支持:
\dfrac12\pi = \arcsin 1 ,
好吧不支持, 是否考虑添加?
有math插件可以支持latex格式,不过有必要吗 ![]()
自然是没绝对必要, 只是觉得有了会很帅. 而且如果以后有涉及图形学方面的教程帖子, 尽早引入 MathJax 也不失为一件好事.
好的没问题
Mod 失效教程写的非常专业
我按教材解决了多年的烦恼
666,很厉害啊
评论区惊现大佬!
Math插件打开了,你可以测试一下
行内公式测试:E = mc^2,以及欧拉恒等式 e^{i\pi}+1=0。
独立公式测试:
求和与积分:
矩阵测试:
我测一测
