一、核心 Section 运行关系与优先级
graph TD
A[Constants] -->|初始化全局变量| B[Key]
B -->|按键事件触发| C[CommandList]
D[TextureOverride] -->|纹理匹配时执行| C
E[ShaderOverride] -->|着色器匹配时执行| C
F[Present] -->|每帧结束时执行| C
C -->|变量传递| G[ShaderRegex]
G -->|注入修改| H[GPU执行]
style A fill:#f9f,stroke:#333
style B fill:#cff,stroke:#333
style C fill:#ffc,stroke:#333
style D fill:#fcc,stroke:#333
style E fill:#cfc,stroke:#333
style F fill:#ccf,stroke:#333
1. Section 执行优先级
| 顺序 | Section 类型 | 触发条件 | 执行频率 | 变量作用域 |
|---|---|---|---|---|
| 1 | [Constants] |
初始化时 | 一次 | 全局持久化 |
| 2 | [Key_*] |
按键事件 | 事件驱动 | 全局 |
| 3 | [TextureOverride_*] |
纹理哈希匹配 | 按需 | 局部+全局 |
| 4 | [ShaderOverride_*] |
着色器哈希匹配 | 每绘制调用 | 局部+全局 |
| 5 | [CommandList_*] |
被显式调用时 | 按需 | 局部(可转全局) |
| 6 | [Present] |
帧结束(present调用) | 每帧 | 全局 |
| 7 | [ShaderRegex] |
着色器加载时 | 着色器初始化时 | 着色器寄存器级别 |
2. 变量传递机制
| 变量类型 | 声明方式 | 作用域 | 生命周期 | 示例 |
|---|---|---|---|---|
| 全局变量 | global $var = value |
所有Section | 游戏进程 | global $censor = 0 |
| 持久化全局变量 | persist global $var = value |
所有Section | 跨游戏启动 | persist global $cfg |
| 局部变量 | local $temp = value |
当前CommandList | CommandList内 | local $backup = x10 |
| 寄存器变量 | x217 / y172等 |
GPU着色器内 | 绘制调用 | x217 = $h/360.0 |
| 正则捕获变量 | ${group_name} |
ShaderRegex替换块内 | 替换操作期间 | ${header} |
二、3DMigoto 运行时序架构
sequenceDiagram
participant Game
participant 3DMigoto
participant GPU
Game->>3DMigoto: CreateTexture/Shader
3DMigoto->>3DMigoto: 计算哈希值
alt 纹理哈希匹配
3DMigoto->>[TextureOverride]: 执行关联CommandList
else 着色器哈希匹配
3DMigoto->>[ShaderOverride]: 执行CommandList
3DMigoto->>[ShaderRegex]: 汇编代码修改
end
Game->>3DMigoto: DrawCall
3DMigoto->>GPU: 注入修改后的着色器
3DMigoto->>GPU: 绑定覆盖的纹理
Game->>3DMigoto: Present()
3DMigoto->>[Present]: 执行帧末逻辑
3DMigoto->>GPU: 提交绘制命令
loop 每帧
GPU-->>3DMigoto: 寄存器状态反馈
3DMigoto->>[CommandList]: 条件执行逻辑
end
三、着色器修改流程
graph TB
A[游戏创建着色器] --> B[3DMigoto截获字节码]
B --> C[反汇编为文本]
C --> D{匹配ShaderRegex?}
D -- Yes --> E[正则替换]
D -- No --> F[保留原始]
E --> G[重新汇编为字节码]
G --> H[替换游戏着色器]
H --> I[GPU执行修改版]
评论