NokiMo
sora_
sora_

patreon


关于星铁贴图错误的问题如何手动修复

游戏已经3.5了,新地图依旧有一些人MOD出现贴图错误,我自己的MOD都已经进行了修改确保不会出现错误,但别人的MOD由于格式可能千奇百怪,我没法出一个统一的修复脚本,这篇帖子就来说说如何手动修复(我这里不提供hash列表,需要你自己去找,可以从我的MOD中找到或者自己使用GUI_collect去找),我尽量说的通俗易懂

这里以驭空的MOD为例(这里只有XXMI的格式,别的格式我不熟,但基本原理应该是一样的),首先打开MOD文件夹下的ini文件,搜索“IB]”,会看到以下内容,每个中括号带IB的部分后面都会有同样hash的[TextureOverrideXXXXXXA],根据角色不同可能还有B C D E F:

存在问题的MOD基本上都是用的插槽的格式,因此基本格式都是

[TextureOverrideXXXXXXA]

hash = xxxxxxxx ←同一个ib下这个值是同样的

match_first_index = xxxx ←根据上面中括号内的A B C D E…发生变化

ib = ResourceyukongAIB ←调用A B C D E…对应的IB文件,凡是带有Resource前缀的,基本上ini最后面; Resources -----的部分中都有对应的调用的具体文件名,贴图也一样。

ps-t2 = ResourceyukongADiffuse ←让Diffuse贴图(漫反射颜色贴图,颜色的基本纹理)占用ps-t2的插槽

ps-t3 = ResourceyukongALightMap ←让LightMap贴图(光照贴图,不同环境下模拟光照效果,基本上是橙色+透明色)占用ps-t3的插槽。

drawindexed = xxxx ←绘制模型,如果在ib部分就有了,这里就不会有,带if和endif是不同的差分

出现问题的原因是在低画质或者新地图,这个插槽不是固定的,Diffuse贴图可能会跑到ps-t0、ps-t4,LightMap贴图可能会跑到ps-t1、ps-t5,另外,LightMap贴图有时候也会占用ps-t0来影响轮廓线颜色。你可以发现Diffuse和LightMap都可能占用ps-t0,因此把所有可能占用的插槽都写下是行不通的,因为不情况下插槽可能由不同的贴图占据。

因此,要修复它有两种办法,分别是hash替换和filter+插槽的方法,这里着重讲hash替换法,下面是操作方法:

插槽部分可能千奇百怪,ps-t0~9可能都会出现,前后可能还有各种if和endif, 直接将插槽部分整个剪切出来。ps-tX后面的ResourceXXXXADiffuse和ResourceXXXXALightMap后面需要用到。然后到[TextureOverrideXXXXXXA]结束的地方(有空行的地方)后面加下面两段内容:

[TextureOverrideyukongADiffuse]

hash = 9e0f6958

this = ResourceyukongADiffuse

[TextureOverrideyukongALightMap]

hash = 220a5367

this = ResourceyukongALightMap

中括号的内容为[TextureOverrideXXXXX],分别添加了Diffuse和LightMap,确保不要和ini文件中其他中括号内容相同,相同会导致失效,然后后面跟hash = xxxxxxxx,这个hash需要自己找(后附教程)或者在我的同角色的mod的ini中找到,再跟this = Resourcexxxxxx ,这部分要保持和前面插槽部分剪切出来的Resource后面的内容一致。如果前面复制插槽的时候有if和endif,且if后面跟的内容不是ps-tX == xx的情况下(这个是filter+插槽,和MOD差分无关),需要完整复刻那个嵌套格式来保证mod修复的完整(可能存在多个贴图做出来的差分,例如ResourceyukongADiffuse1,ResourceyukongADiffuse2,ResourceyukongADiffuse3,在ini尾部都有其对应的具体dds文件),只要在hash后面将这个嵌套复制进去,然后将相应ps-tX的部分修改为this即可保留mod原有的差分,注意要将Diffuse和LightMap分开到对应中括号下的内容中。

然后这个是 [TextureOverrideXXXXXXB]部分,一样的格式,一样要将插槽部分整个剪切出来,如果有C D E F,也一样这样操作(注意,如果ResourceXXXXADiffuse这部分的内容和前面的A中有区别,比如是ResourceXXXXBDiffuse,需要去看一下文件夹中这两个贴图是不是一样的,存在一种情况mod无法被修好,那就是XXXXADiffuse和XXXXBDiffuse具有同样的hash,但MOD实际的贴图内容存在不一样的地方),新角色基本上都统一了贴图,一个角色身体只有一个Diffuse贴图和LightMap贴图。老角色和身体部分比较多(有C D E F这些的)的可能会有更多的Diffuse贴图和LightMap贴图(具有不同的hash),对于这些也要添加相应的内容,例如分为不同的A和B:

[TextureOverridexxxxxxxxADiffuse]

hash = xxxxxxxx

this = ResourceyukongADiffuse

[TextureOverridexxxxxxxxALightMap]

hash = xxxxxxxx

this = ResourceyukongALightMap

[TextureOverridexxxxxxxxBDiffuse]

hash = xxxxxxxx

this = ResourceyukongADiffuse

[TextureOverridexxxxxxxxBLightMap]

hash = xxxxxxxx

this = ResourceyukongBLightMap

一定要确保ADiffuse和BDiffuse的hash是不同的(具体可以看mod的贴图中保留的官方贴图的部分是否是一样的)。

另外还存在一种不同的格式,那就是合并过的mod,这类MOD插槽部分会被转移到; CommandList ----的部分,搜索IB]后通常会发现下面这样格式的内容:

[TextureOverridexxxxIB]

hash = xxxxxxxx

run = CommandListxxxxxxxxIB

[TextureOverridexxxxA]

hash = xxxxxxxx

match_first_index = 0

run = CommandLisxxxxA

这种就比较难修了,你需要再搜索CommandLisxxxxA,在CommandList ----中找到插槽部分,这部分每一个swapvar都有一个插槽部分,你需要先将[CommandLisxxxxA]的整个内容复制下来,然后将其中每一个swapvar后的插槽部分删掉,再将复制的部分中非插槽的部分(ib = ResourceXXXX和drawindexed的部分)删掉,然后将diffuse和lightmap分开复制到对应的部分并将ps-tX改为this,大致格式如下(对于如果存在的B C D E……部分也要删掉插槽部分):

[TextureOverridexxxxADiffuse]

hash = xxxxxxxx

if $swapvar == 0

this = ResourcexxxxADiffuse.0

else if $swapvar == 1

this = ResourcexxxxADiffuse.1

else if $swapvar == 2

this = ResourcexxxxADiffuse.2

else if $swapvar == 3

this = ResourcexxxxADiffuse.3

endif

[TextureOverridexxxxALightMap]

hash = xxxxxxxx

if $swapvar == 0

this = ResourcexxxxALightMap.0

else if $swapvar == 1

this = ResourcexxxxALightMap.1

else if $swapvar == 2

this = ResourcexxxxALightMap.2

else if $swapvar == 3

this = ResourcexxxxALightMap.3

endif

做到这里,基本上MOD就修复完毕了,但还存在一些特例,使用这样的办法无法完整修复,就是除了Diffuse贴图和LightMap贴图外,还存在StockingMap(丝袜贴图,影响丝袜材质效果,蓝黑条纹的贴图,在丝袜的部分会有粉黄渐变的部分)和MaterialMap(效果贴图,不一定命名为Material,主要特征是只存在黑白两种颜色的贴图,会影响一些透明和角色的特效)的一些MOD,这些贴图如果不做修复会导致角色身上某些小范围出现黑块或是不应该有的特效。

其中StockingMap比较好修复,它占用的插槽是ps-t4、ps-t6、ps-t8,但由于XXMI预设中默认检测的插槽只到ps-t5(前面使用的hash this = resource的方法替换贴图的时候只能替换插槽在ps-t0~ps-t5的部分),因此对于这类贴图,在不修改XXMI预设的情况下,有两种办法修复,一是加checktexture然后还是hash替换,二是hash+filter。推荐使用第一种方法

加checktexture:

找到ini中下面的内容:

ib = ResourcexxxxxIB

同样的,对于不同角色可能存在多个层,会有多个上面的内容,需要做的只有在上面的内容后加上下面几行:

CheckTextureOverride = ps-t6

CheckTextureOverride = ps-t7

CheckTextureOverride = ps-t8

CheckTextureOverride = ps-t9

然后和最开始教的一样直接使用hash就行了:

[TextureOverridexxxxxxxxAMaterialMap]

hash = xxxxxxxx

this = ResourceyukongAMaterialMap

[TextureOverridexxxxxxxxAStockingMap]

hash = xxxxxxxx

this = ResourceyukongAStockingMap

示例:

另外一种方法是filter+hash,具体方法如下(这种修复方式可能会因为一些特例而失效,因此不推荐),在ini空白部分添加下面内容:

[TextureOverridexxxxxxxxAStockingMap]

hash = xxxxxxxx

filter_index = 37

hash同样需要自己找或者在我的同角色的mod的ini中找到,filter_index后面的值可以自己定,可以定的高一点,注意数值要做出区分(hash不同的贴图如果具有同样的内容-可能是分辨率不一样,可以用相同的值,但hash相同的贴图不要定不同的值,即使不在同一个ini内也不行),然后回到前面 [TextureOverrideXXXXXXA]的部分,在插槽的地方添加下面内容(注意ps-tx后面resource的内容要保持和MOD原来的一致):

if ps-t4 == 37

ps-t4 = ResourcexxxxxxxxAStockingMap

endif

if ps-t6 == 37

ps-t6 = ResourcexxxxxxxxAStockingMap

endif

if ps-t8 == 37

ps-t8 = ResourcexxxxxxxxAStockingMap

endif

需要注意B C D E部分也要在插槽的部分加上这些内容,但如果你明确有丝袜的模型是在哪个部分,则其他部分不用加也没关系,这样就可以修复StockingMap的部分。filter+插槽的方法基本上就是贴图可能占用哪个插槽,就在插槽部分加对应插槽的这段内容

if ps-tX == xx

ps-tX = ResourcexxxxxxxxAXXXX

endif

关于MaterialMap的部分则不好修复,因为根据角色不同,这个贴图跳跃的插槽太不固定了,只能根据具体角色使用具体的hash+filter的方法,原理相同,可以在我的mod中找到是什么样的格式。头发和脸的贴图不存在超过ps-t5的贴图,因此使用hash替换的方法即可

关于如何找到hash:

1.我的MOD中打开ini,搜索“Diffuse]”,基本都可以找到

2.如果是我没做过的角色或者头发/脸,可以自行去dump

3.找别人的dump:https://github.com/SilentNightSound/SR-Model-Importer-Assets/tree/main/PlayerCharacterData

(需要一定英文基础,不保证是最新的hash,而且缺少一些materialmap的hash,找到对应角色后打开hash.json文件,可以看到hair(头发) head(脸) body(身体)部分中texture_hashes后的各种贴图的hash)

如何dump:

先在XXMI中打开Enable Hunting

进入游戏,按F6取消MOD显示或者干脆将角色MOD移除(F10刷新然后切换一下模型),不然会影响dump,然后确保角色在画面中的情况下(通常在角色列表界面就可以了)按小键盘0打开绿字,然后按F8,这个时候游戏会卡一段时间,等到恢复后就dump完毕了,会在XXMI的SRMI目录下生成一个FrameAnalysis-xxxxxxxx文件夹,然后就是提取模型

如何提取模型(注意,需要安装python):

使用下面这个提取工具(gui_collect):

https://github.com/Petrascyll/gui_collect

进入页面后,点击右边的releases,然后点击下载Source code(zip)并解压,进入gui_collect文件夹,双击launch.bat打开

先点击图中1的部分选中游戏(星铁),点击图中3的部分选择刚才dump的FrameAnalysis-xxxxxxxx文件夹,2的部分需要填入ib的hash,这个需要在游戏中寻找,具体方法是小键盘0打开绿字,和dump时候一样确保角色在画面中的情况下按小键盘7和8(往前和往后),一直按到想要提取的部分消失(星铁的角色主要分为身体、头发、脸三个不同的ib,想要哪部分的贴图的hash就按到哪部分消失),然后按小键盘9复制这个hash,填到上图中2的部分,2部分下面的component name是部位名称,在只有一个ib的情况下不用填写。4的部分为提取后的文件夹名称,随便填写,5的部分三个选项分别为提取的时候删除同名文件夹下所有内容、提取完成后打开提取的文件夹、提取后删除FrameAnalysis-xxxxxxxx文件夹。可以直接按照我这样设置。这些都弄好后,按6的部分Extract,即可进入选择贴图的界面,下面以大黑塔的贴图为例:

进入贴图选择界面后可以看到上面的内容,1的部分为前面提到的A B C D E……不同部分,部分角色不同part贴图hash可能不一样,在这里点击就能看到。可以看到右侧会显示存在的不同贴图的插槽和它们的hash,在贴图上按左键可以选择贴图的名称(这个是提取模型才需要去选择,只是获取hash不需要选),按右键会出现图上3部分显示的内容,选择第一个即可复制这个hash,然后填到ini中对应的部分(第二个是在FrameAnalysis-xxxxxxxx文件夹中找到这个贴图文件)。上图中ps-t2是diffuse贴图,ps-t3是lightmap贴图,ps-t6是stockingmap贴图,ps-t8是materialmap贴图(大黑塔帽子的星空特效就是这个贴图在起作用,因此不修复这个贴图就可能导致MOD的身体上出现奇怪的星空效果)

ID(2的部分)下面的不同数字可以都点一点,看看贴图具体会占用哪些插槽,这里就可以看到大黑塔的diffuse贴图占用了ps-t2和ps-t7,翻一下2的部分可以看到diffuse还占据了ps-t0 ps-t4,在这里就能找到filter+插槽的方法格式应该怎么写。

需要留意的只有具有diffuse贴图规律的那些贴图,上图中ID000093中ps-t6的贴图就是和diffuse贴图无关的贴图,不需要去管。

到这里就基本结束了,有什么问题欢迎留言,我尽量完善

Comments

大佬,希儿的ADiffuse和BDiffuse的hash是一样的,但是mod里的A和B的resource是不一样的,这种是不是没法修了

Jeatricy Vollerei

新地图三月,星,花火全是黑的,实在受不了了来学习,发现看不懂一点,另辟蹊径,发现把角色质量从高改成中,竟然正常了...

Sun Red

请问一下,我找了一个希儿武器的外观mod,用了后不只贴图错误就连武器位置都错位了 我试着修復一下,武器位置是正常了没有错位,可贴图依旧错误

なのは

你说的应该是在不同层的吧?都写上,然后resource分别对应上原MOD的这个贴图

sora_

请问一下大佬,在ps-t2插槽有两个不同hash的不同贴图,这个我应该怎么写呀

xjzn xjxn

总之还是大佬的解说

天磊

好吧,在最后一步难到我了,模型提取出来之后,完全不知道应该修改ini文件夹的那一部分,而且模组文件夹里面有两个ini文件。不知道应该修改那一个。

天磊

需要安装python

sora_

进入页面后,点击右边的releases,然后点击下载Source code(zip)并解压,进入gui_collect文件夹,双击launch.bat打开,launch.bat,我的电脑为啥打不开这个文件

天磊

他真的想教会我如何修复,他真的,我哭死

Yowenr Fan

蹲个全哈希修复脚本(我承认我是懒鬼)🥺

Tsubaki Suzakuin

没有的话按理说贴图应该没坏,因为说明MOD原本用的不是插槽而是hash

sora_

要是ini里没有ps-t这个咋办,CommandLisxxxxA这个也没有

nekomimi

I have problem about some parts of the skin are missing, it like the some parts of the skin are transparent. I don't know how to fix it (Firefly mod)

Osora Chan

谢谢

苍东 藤菜

我上面提到过了,if ps-t2的这种去掉,只保留resource,然后合并同类型。另你后面提到的瞬间损坏,通常是游戏占用高的时候会出现,我推测是CS解包的资源不够,速度跟不上导致的,把画质降一降可能减少这种情况出现

sora_

感谢教学

DD D

谢谢大佬!虽然我明白大佬已经在尽力把这件事情讲的很简单了,但是当我所受打开我的星的mod发现TextureOverrideStelleA里面的if语句有判断if ps-t2 == 37 ... elif ps-t0 == 38这样和例子中不一样的情况时我就又不知道该怎么办了-_-|,以及就算我在游戏内通过F6显示原皮(似乎是关闭SRMI)以后在和昔涟进任务云石天宫浴场的时候地图上所有的人(包括没有任何Mod组件的NPC)都会高频出现损坏的瞬间,请问这个有办法解决嘛

ForeverFirefly

赛博菩提祖师

。 。

感谢大佬无私分享!

Acheron

謝佬

枠 斅


Related Creators