尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何让CyberFSR2支持新游戏?为3A大作编写相机钩子的开发者完整指南

如何让CyberFSR2支持新游戏?为3A大作编写相机钩子的开发者完整指南 如何让CyberFSR2支持新游戏为3A大作编写相机钩子的开发者完整指南【免费下载链接】CyberFSR2FidelityFx Super Resolution 2.0 for Cyberpunk项目地址: https://gitcode.com/gh_mirrors/cy/CyberFSR2CyberFSR2 是一个开源的即插即用 DLSS 替换方案用FSR 2.0为《赛博朋克 2077》等 3A 大作提供免费的超分辨率渲染。想让它支持一款新游戏核心工作量只有一件事为新游戏编写相机钩子ViewMatrixHook让 CyberFSR2 能实时读取游戏的视场角FOV、近裁剪面和远裁剪面从而正确重建 FSR 2.0 所需的视图矩阵。本文是一份完整的开发者指南带你从零完成一个新游戏的相机钩子开发。一、为什么支持新游戏需要相机钩子FSR 2.0 不是简单的图像拉伸它需要深度缓冲、运动向量和视图矩阵来重建真实分辨率画面。而视图矩阵的构建必须知道相机三要素参数含义获取接口FOV视场角视角GetFov()NearPlane近裁剪面距离GetNearPlane()FarPlane远裁剪面距离GetFarPlane()这三个值就藏在每个游戏自己的内存里。CyberFSR2 通过相机钩子在游戏运行时挖出这些数值——这就是相机钩子的意义。目前已内置的钩子由 Config.h 中的ViewMethod枚举统一管理包含Config配置模式、Cyberpunk2077、RDR2、DL2消逝的光芒2四种新游戏就是向这张名单里添加一位新成员。二、快速上手配置模式Config免代码支持如果新游戏的 FOV 是固定值或可手动查到的你甚至不用写一行代码CyberFSR2 支持纯配置模式只需在游戏目录的配置文件nvngx.ini的[View]段中填写三个参数[View] MethodConfig VerticalFOV60 NearPlane0.0 FarPlane10000配置解析逻辑在 Config.cpp 中MethodConfig会触发ViewMatrixHook::Configured分支见 ViewMatrixHook.cpp 的工厂函数Create。参考现成的 nvngx.ini 模板即可上手。适用场景FOV 固定不变、或玩家可自行在游戏设置里确认数值的单机大作。三、进阶实战为新游戏编写专属相机钩子对于 FOV 动态变化玩家可调、随视角模式切换的游戏需要编写专属钩子共四步。1. 读懂钩子接口三行纯虚函数ViewMatrixHook.h 定义了钩子基类接口极其简洁class ViewMatrixHook { public: virtual float GetFov() 0; virtual float GetFarPlane() 0; virtual float GetNearPlane() 0; static std::unique_ptrViewMatrixHook Create(const Config config); };你的任务新建一个继承自ViewMatrixHook的内部类在构造函数里定位到游戏内存中的相机参数结构体然后让三个纯虚函数直接返回结构体字段。2. 字节模式扫描在游戏内存里挖出相机参数游戏更新版本后地址会变硬编码地址很快失效。CyberFSR2 的解法是字节模式扫描在 scanner.cpp 中FindPattern函数支持带?通配符的十六进制掩码在整个模块内存中搜索特征字节序列。以赛博朋克 2077 的钩子为例ViewMatrixHook.cppauto loc *(uintptr_t*)scanner::GetOffsetFromInstruction(LCyberpunk2077.exe, F3 0F 7F 0D ? ? ? ? E8, 4); camParams ((CameraParams*)(loc 0x60));拆解一下LCyberpunk2077.exe扫描目标模块游戏主程序或关键 DLLF3 0F 7F 0D ? ? ? ? E8特征字节掩码?表示忽略的字节如地址占位符4模式命中后读取偏移取到相对寻址的目标loc 0x60从锚点地址再偏移指向真正的相机参数结构体然后按游戏内存布局定义结构体让字段对齐struct CameraParams { unsigned char unknown0[0x20]; float Fov; unsigned char unknown1[0x1C]; float NearPlane; float FarPlane; };如何找到特征码作者在代码中留下了实用提示先搜索垂直 FOV 赋值指令定位结构体再顺着引用链找静态引用。实践中可用 Cheat Engine 等工具辅助定位特征字节。3. 注册新钩子三处修改接入系统写好新游戏子类后需要在三个文件中完成注册Config.h—— 在ViewMethod枚举中新增一个值如MyNewGameViewMatrixHook.cpp—— 在工厂函数Create的switch中增加对应case返回你的新钩子类Config.cpp—— 在Config::Reload末尾按可执行文件名匹配为该游戏默认选中新钩子auto exeName Util::ExePath().filename(); if (exeName LCyberpunk2077.exe) Method Method.value_or(ViewMethod::Cyberpunk2077); // 在这里仿照上面追加你的游戏 exe 名这样玩家无需任何配置CyberFSR2 识别到该游戏可执行文件时会自动启用新相机钩子。同时记得在 Config.cpp 的readViewMethod中加上对应的字符串解析分支。四、避坑指南复杂案例的启示消逝的光芒 2真实 3A 大作的相机数据往往不在一个地方。ViewMatrixHook.cpp 中的DL2子类揭示了三个典型坑点参数分散在多个模块真实 FOV 存在gamedll_ph_x64_rwdi.dll而部分指针在engine_x64_rwdi.dll中需要跨模块跳转FOV 被拆成两部分游戏内部默认 FOV 固定为 57玩家调节值单独存放在extraFOV真实 FOV 两者相加指针惰性初始化某些地址在游戏世界加载完成前不可访问需改用其他稳定锚点计算编写钩子前建议先通读这三个现成实现它们覆盖了简单到复杂的全部场景。五、编译与部署让你的钩子上线编译环境要求见 README.mdVisual Studio 2022 最新 Vulkan SDK递归克隆仓库含所有子模块git clone --recursive https://gitcode.com/gh_mirrors/cy/CyberFSR2先在 external/FidelityFX-FSR2 中按官方文档编译 FSR 2.0 子模块再用 VS2022 打开 CyberFSR.sln 编译主项目Debug/Release 需与 FSR2 一致将产出的 DLL 重命名为nvngx.dll与 FSR2 的 API DLL 一起放入游戏目录运行 EnableSignatureOverride.reg 允许加载未签名 DLL启动游戏在画面设置中选择 DLSS 质量档位FSR 2.0 即接管渲染六、新游戏支持清单Checklist用扫描器工具确认游戏相机参数的特征字节码定义与游戏内存布局对齐的CameraParams结构体在 ViewMatrixHook.h 中新建钩子类实现三个纯虚函数在 Config.h 枚举、ViewMatrixHook.cpp 工厂、Config.cpp 的 exe 匹配与字符串解析中完成注册验证 FOV 随游戏内调节实时变化否则画面会拉伸或透视异常按 README.md 编译部署并实测画面总结为 CyberFSR2 添加新游戏支持本质上是字节模式扫描 结构体对齐 三处注册的标准流程FOV 固定的游戏走配置模式即可零代码接入动态 FOV 的游戏则编写专属ViewMatrixHook子类。参考赛博朋克 2077、RDR2 和消逝的光芒 2 三个现成钩子的实现你就能为自己的目标 3A 大作快速搭好这台免费的 FSR 2.0 超分引擎 【免费下载链接】CyberFSR2FidelityFx Super Resolution 2.0 for Cyberpunk项目地址: https://gitcode.com/gh_mirrors/cy/CyberFSR2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表