shadPS4 如何把游戏着色器从 SPIR-V 反编译为 GLSL 并替换修改后的版本?
【免费下载链接】shadPS4PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C++项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4
shadPS4 运行时加载的游戏着色器以 SPIR-V 二进制(.spv)形式存在,直接查看或修改并不方便。documents/patching-shader.md 给出了一条完整的修改路径:先让模拟器把着色器转储到本地,用spirv-cross把 SPIR-V 反编译为可读的 GLSL 文本,改完再用glslc编译回 SPIR-V,把同名的.spv文件放进shader/patch目录,最后开启patchShaders选项让模拟器加载修改后的版本。本文按这条路径逐步说明操作。
前置条件:安装 Vulkan SDK 并确保工具在 PATH 中
反编译和重新编译两步都依赖外部工具,这是文档明确要求的唯一前置条件:
- 安装 Vulkan SDK,并确保
spirv-cross和glslc都在 PATH 中。spirv-cross负责 SPIR-V → GLSL 的反编译;glslc负责 GLSL → SPIR-V 的编译。
安装完成后,在终端直接输入这两个命令应能调用工具(若提示找不到命令,说明 PATH 未配置好,后续步骤无法继续)。
第一步:开启转储,让模拟器导出着色器
- 在
config.toml中启用dumpShaders选项。 - 启动模拟器并运行游戏,模拟器会把加载到的着色器写到转储目录。
根据 documents/Debugging/Debugging.md 的配置说明,dump_shaders对应 GPU 配置项,转储路径为../user/shader/dumps(即user目录下的shader/dumps子目录)。文档中着色器文件的示例命名为fs_0x000000.spv,其中前缀标识着色器阶段,例如fs_对应 fragment(片段)着色器。转储完成后,在该目录下找到你要修改的那个.spv文件。
第二步:用 spirv-cross 反编译为 GLSL
对目标.spv文件执行文档给出的反编译命令:
spirv-cross -V fs_0x000000.spv --output fs_0x000000.glsl-V指定输出为 Vulkan 风格的 GLSL;- 输入为你在
shader/dumps中找到的.spv文件名,--output指定生成的 GLSL 文件名。
命令执行后会得到一份可读的 GLSL 源码文件,其中的变量和数值都可以正常编辑。
第三步:编辑 GLSL 并重新编译回 SPIR-V
按需要在文本编辑器中修改 GLSL 文件,然后把改动编译回 SPIR-V:
glslc --target-env=vulkan1.3 --target-spv=spv1.6 -fshader-stage=frag fs_0x000000.glsl -o fs_0x000000.spv这里需要特别注意-fshader-stage参数:文档明确要求把它改为着色器对应的阶段(例如片段着色器用frag)。示例中的frag与文件名前缀fs_对应,编译顶点等其他阶段的着色器时,该参数要与着色器实际阶段一致,否则产物无法被正确识别。
-o之后是输出的.spv文件名,文档要求它与原始着色器同名。
第四步:放入 patch 目录并启用 patchShaders
- 把重新编译出的
.spv文件放到shader/patch目录中,文件名与原始着色器完全一致(例如仍是fs_0x000000.spv)。模拟器正是按阶段与哈希生成的同名规则去shader/patch目录查找补丁文件(参见 vk_pipeline_cache.cpp 中PipelineCache::GetShaderPatch的实现,补丁目录为GetUserPath(PathType::ShaderDir) / "patch")。 - 在
config.toml中启用patchShaders选项。 - 重新启动模拟器运行游戏,修改后的着色器即会替代原版被加载。
验证与结果判断
- 反编译是否成功:
spirv-cross命令执行后生成了非空的.glsl文本文件,内容是可读的 GLSL 代码。 - 编译是否成功:
glslc命令执行后生成了新的.spv文件。 - 补丁是否会被采用:确认
.spv文件已存在于shader/patch目录且与转储目录中的原始文件同名,并且config.toml中patchShaders已启用。文档给出的流程到此即告完成;游戏画面中的实际效果需要自行对照修改内容判断。
限制与注意
- 整条流程依赖
spirv-cross和glslc两个外部工具,缺少其中任一步都无法完成。 -fshader-stage必须与着色器阶段匹配,这是文档特别强调的一点。- 补丁文件命名规则是阶段前缀加哈希值,重命名或漏掉哈希位都会导致模拟器查不到对应补丁,请严格沿用转储出来的原文件名。
- 修改 GLSL 后的行为完全取决于你写入的代码,文档没有对修改内容做任何限制说明;若编译后的着色器无法工作,先检查
glslc命令的阶段参数是否选对。
相关文档:documents/patching-shader.md、documents/Debugging/Debugging.md。
【免费下载链接】shadPS4PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C++项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考