🚀【3DMigoto 教程】跨部位借用材质:零延迟 + 完美光影的终极公式
💡 我们要实现什么效果?
你想让衣服(或身体)穿上皮肤的特效材质。
本教程采用独创的**“时空拆分法”**,教你像搭积木一样,彻底消灭延迟和碎影,实现完美的无缝换装!
📦 准备工作:下载 4 个核心文件
在开始前,请确保你已经获取了以下 4 个脚本文件,把它们直接扔进你 Mod 的 ini 同级目录下:
extract_cb1_vs.hlsl
extract_cb1_ps.hlsl
record_bones_cs.hlsl
redirect_cb1_cs.hlsl
📖 课前必修课:两套“魔法公式”
这套架构的精髓,就是把“存骨骼”和“换骨骼”变成了两句指令。你在写代码时,只需要套用这两个公式:
🪄 公式 1:存入骨骼(上传自己的动作)
想用谁的骨骼,就必须先让它把动作存起来!公式如下:
; 1. 提取原生数据
run = CustomShader_ExtractCB1
; 2. 告诉系统你要存谁(等于谁的身份证)
cs-t2 = ResourceID_Hand
; 3. 执行存入
run = CustomShader_RecordBones
🪄 公式 2:切换骨骼(调用已保存的动作)
想让模型跟着谁动,就把骨骼切换成谁!公式如下:
; 1. 告诉系统你想用谁的动作
cs-t2 = ResourceID_Body
; 2. 执行切换
run = CustomShader_RedirectCB1
💡 总结:想切换成谁,cs-t2 就填谁。想调用之前,必须先存入。条理就是这么清晰!
🧱 第一块积木:搭建“公共云盘”(🚨 直接复制,绝对不要改)
我们要建一个显存公共空间,让所有部位都能互通数据。
操作: 打开你的 ini 文件,找到最上方的 [Constants] 区域,在它下面原封不动粘贴以下代码:
; =========================================================
; 【公共云盘区】(🚨 核心基建,绝对不要修改!)
; =========================================================
[ResourceDumpedCB1_UAV]
type = RWStructuredBuffer
stride = 16
array = 4096
[ResourceDumpedCB1_SRV]
type = Buffer
stride = 16
array = 4096
[ResourceFakeCB1_UAV]
type = RWStructuredBuffer
stride = 16
array = 4096
[ResourceFakeCB1]
type = Buffer
stride = 16
format = R32G32B32A32_UINT
array = 4096
[ResourceFakeT0_UAV]
type = RWStructuredBuffer
stride = 16
array = 120000
[ResourceFakeT0_SRV]
type = StructuredBuffer
stride = 16
array = 120000
[CustomShader_ExtractCB1]
vs = extract_cb1_vs.hlsl
ps = extract_cb1_ps.hlsl
ps-u7 = ResourceDumpedCB1_UAV
depth_enable = false
blend = ADD SRC_ALPHA INV_SRC_ALPHA
cull = none
topology = point_list
draw = 4096, 0
ps-u7 = null
ResourceDumpedCB1_SRV = copy ResourceDumpedCB1_UAV
[CustomShader_RecordBones]
cs = record_bones_cs.hlsl
cs-t0 = vs-t0
cs-t1 = ResourceDumpedCB1_SRV
cs-u1 = ResourceFakeT0_UAV
dispatch = 12, 1, 1
cs-u1 = null
cs-t0 = null
cs-t1 = null
ResourceFakeT0_SRV = copy ResourceFakeT0_UAV
[CustomShader_RedirectCB1]
cs = redirect_cb1_cs.hlsl
cs-t0 = ResourceDumpedCB1_SRV
ResourceFakeCB1_UAV = copy ResourceDumpedCB1_SRV
cs-u0 = ResourceFakeCB1_UAV
dispatch = 1, 1, 1
cs-u0 = null
cs-t0 = null
ResourceFakeCB1 = copy ResourceFakeCB1_UAV
[ShaderOverridevs2]
hash = 847947b4a1ad40cf
filter_index = 200
[ShaderOverridevs10]
hash = ac358c21b925075b
filter_index = 201
[ShaderOverridevs1]
hash = b1ca4834786821dd
filter_index = 202
[ShaderOverridevs33]
hash = cdf11b288d812606
filter_index = 203
[ShaderOverridevs88]
hash = 8e1c0782db9e85d1
filter_index = 303
[ShaderOverridevs22]
hash = 6d85d78157be3f4c
filter_index = 200
🪪 第二块积木:发放“身份证”(✍️ 可根据需求增减)
给每个参与换装的部位发一个独一无二的“身份证”,以免互相拿错骨骼data每次递增1000。
操作: 在上面代码的下方,粘贴这几个身份证:
; =========================================================
; 【身份证区】
; =========================================================
; 给衣服/身体发的身份证 (0 号位)
[ResourceID_Body]
type = Buffer
format = R32_FLOAT
data = 0.0
[ResourceID_Hand]
type = Buffer
format = R32_FLOAT
data = 1000.0
🧥 第三块积木:改造“身体”(✍️ 填入你自己的数据)
身体是被借用的对象。它只负责在“阴影阶段”存骨骼,并画自己的影子(防止错乱)。
操作: 找到你身体的 [TextureOverride...] 代码块,按下方模板替换:
[TextureOverride_IB_cced9603_body_Component1]
; ✍️ 填入你身体/衣服的 hash
hash = cced9603
handling = skip
$active0 = 1
; 🌟 动作 A:只在 vs==200 (阴影阶段) 干活!
if vs == 200
; 1. 存入身体的骨骼
run = CustomShader_ExtractCB1
cs-t2 = ResourceID_Body
run = CustomShader_RecordBones
; 2. 切换身体骨骼,画自己的影子(防止碎影 Bug)
cs-t2 = ResourceID_Body
run = CustomShader_RedirectCB1
vs-t0 = ResourceFakeT0_SRV
vs-cb1 = ResourceFakeCB1
; ✍️ 绑定身体的全部顶点和骨骼权重数据
vb0 = Resourcecced9603Position
vb1 = Resourcecced9603Texcoord
vb2 = Resourcecced9603Blend
vb3 = Resourcecced9603Position
ib = Resource_cced9603_Component1
; ✍️ 填入你衣服的 drawindexed 数字!
drawindexed = 232116,172770,0
endif
; -> ✍️ 如果衣服里还有“不需要借材质”的普通裙子/挂件,直接写在这里 <-
; drawindexed = 9564,163206,0
; 🚨 打扫战场:这三句必须保留!
post vs-cb1 = null
post vs-t0 = null
post cs-t2 = null
🧤 第四块积木:改造“手部”(✍️ 见证奇迹的时刻)
手部是提供材质的大佬。它要存自己的骨骼,画自己的影子和肉体,最后把身体叫过来,给身体披上手部的材质!
操作: 找到你手部的 [TextureOverride...] 代码块,按下方模板替换:
[TextureOverride_IB_149f97a2_hand_Component1]
; ✍️ 填入你手的 hash
hash = 149f97a2
handling = skip
$active0 = 1
; ===============================================
; 阶段 1:vs == 200 (处理所有阴影)
; ===============================================
if vs == 200
; 1. 存入手部的骨骼
run = CustomShader_ExtractCB1
cs-t2 = ResourceID_Hand
run = CustomShader_RecordBones
; 2. 切换手部骨骼,必须先画一次手的影子,否则影子会丢失!
cs-t2 = ResourceID_Hand
run = CustomShader_RedirectCB1
vs-t0 = ResourceFakeT0_SRV
vs-cb1 = ResourceFakeCB1
; ✍️ 绑定手的全部顶点和权重数据
vb0 = Resource149f97a2Position
vb1 = Resource149f97a2Texcoord
vb2 = Resource149f97a2Blend
vb3 = Resource149f97a2Position
ib = Resource_149f97a2_Component1
; ✍️ 填入手部的 drawindexed 数字!
drawindexed = 82308,0,0
endif
; ===============================================
; 阶段 2:永远正常画手的肉体
; ===============================================
cs-t2 = ResourceID_Hand
run = CustomShader_RedirectCB1
vs-t0 = ResourceFakeT0_SRV
vs-cb1 = ResourceFakeCB1
; ✍️ 绑定手部材质和顶点数据
ps-t13 = ResourceBML
ps-t14 = ResourceNM
vb0 = Resource149f97a2Position
vb1 = Resource149f97a2Texcoord
vb2 = Resource149f97a2Blend
vb3 = Resource149f97a2Position
ib = Resource_149f97a2_Component1
drawindexed = 82308,0,0
; ===============================================
; 阶段 3:vs != 200 (跨界换装,给身体披上手部材质)
; ===============================================
; 🚨 必须写 if vs != 200,避开阴影阶段!
if vs != 200
; 1. 切换成身体的骨骼!(调用第一步里存好的身体动作)
cs-t2 = ResourceID_Body
run = CustomShader_RedirectCB1
; 2. ✍️ 绑定身体的顶点和权重 (注意:不要再绑材质了,直接白嫖手的!)
vb0 = Resourcecced9603Position
vb1 = Resourcecced9603Texcoord
vb2 = Resourcecced9603Blend
vb3 = Resourcecced9603Position
ib = Resource_cced9603_Component1
; 3. ✍️ 画出身体的主模型
drawindexed = 232116,172770,0
endif
; 🚨 打扫战场:必须保留!
post vs-cb1 = null
post vs-t0 = null
post cs-t2 = null
🎉 教程结束!
保存你的 INI 文件,回到游戏按下 F10 刷新。只要你绑齐了 vb0 到 vb3,改对了 Hash 和 drawindexed,你就能获得一个零延迟、无碎影的完美特效模型!去享受你的神级换装成果吧!
2026 3/6修复
修复在无阴影下的骨骼错误
改法如下

2026 3/12修复
修复shaderoverride哈希
[ShaderOverridevs22]
hash = 617db42150841836
filter_index = 200
[ShaderOverridevs2]
hash = 847947b4a1ad40cf
filter_index = 200
[ShaderOverridevs10]
hash = cada6d476255bdcf
filter_index = 201
[ShaderOverridevs1]
hash = d9d6448a7b62687e
filter_index = 202
[ShaderOverridevs33]
hash = e8d242aae0b3bacf
filter_index = 203
[ShaderOverridevs88]
hash = f0e7d4b491273aae
filter_index = 203



闽公网安备35010302000678号


















































