【mod教程】跨材质渲染(三)补充——一键扫荡式跨ib

🚀【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


附件
1
免费
by 戏子、 · 来自踩蘑菇PC端 更新于 2026-03-12
若有附件,打赏后可直接下载 赠人玫瑰 手留余香
默认
最新
1