159 lines
7.6 KiB
Markdown
159 lines
7.6 KiB
Markdown
# 地平线 5(Forza Horizon 5)· DLSS 5 神经渲染 完整配方
|
||
|
||
> 2026-09-18 实测跑通。姊妹文档:`endfield-dlss5-recipe.md`(终末地)。
|
||
> 两者共用同一套结论:**游戏自带 DLSS 时,只需要 OptiScaler-DLSSNR 一个组件。**
|
||
|
||
---
|
||
|
||
## 一、最终可用配置
|
||
|
||
**形态:目录代理单 DLL。** 无反向代理注入、无 ReShade、无 feeder。
|
||
|
||
```
|
||
D:\SteamLibrary\steamapps\common\ForzaHorizon5\
|
||
dxgi.dll OptiScaler-DLSSNR v0.2.0(OptiScaler.dll 改名而来)
|
||
OptiScaler.ini 配置(见下表)
|
||
OptiScaler\ 后端 DLL(FidelityFX / XeSS / D3D12_OptiScaler\D3D12Core.dll)
|
||
nvngx.dll_dlssnr.dll 神经转发器(包内自带)
|
||
nvngx_dlssnr.dll 神经模型 310.8.0.0(需自备)
|
||
nvngx_dlss.dll 游戏自带 3.1.11.0 —— **不要动**
|
||
nvngx_dlssg.dll 游戏自带 —— 不要动
|
||
sl.*.dll 游戏自带 Streamline 2.10.3 —— 不要动
|
||
```
|
||
|
||
**启动方式:Steam 正常启动,不需要换启动器。**
|
||
|
||
### 关键 ini 设置(`OptiScaler.ini`)
|
||
|
||
| 段 | 键 | 值 | 为什么 |
|
||
|---|---|---|---|
|
||
| `[Upscalers]` | `Dx12Upscaler` | `dlss` | 地平线是 D3D12;神经通路必须骑在游戏自己的 DLSS 上 |
|
||
| `[DlssNr]` | `Enabled` | `true` | 默认关 |
|
||
| `[DlssNr]` | `WhitePointScale` | `1.0` | 默认 auto 会**逐帧测光**导致亮度泵动(同终末地) |
|
||
| `[DlssNr]` | `TransferStrength` | `0.7` | 满档 1.0 = 完全是模型的画面 → 噪点明显。0.7 是降噪起点 |
|
||
| `[DlssNr]` | `ColourStrength` | `0.5` | 1.0 = 连模型的颜色一起用 → HDR 场景下色彩噪点偏重 |
|
||
| `[Menu]` | `ShortcutKey` | `0x24`(Home) | |
|
||
| `[Menu]` | `OverlayMenu` | **`false`** | 见「三、已解决的故障」——覆盖层与输入钩子会卡死游戏 |
|
||
| `[Hotfix]` | `ManualInputPolling` | **`true`** | 同上:不 hook WndProc,改成自己轮询 |
|
||
| `[Hotfix]` | `CheckForUpdate` | `false` | 关掉联网版本检查,少一个变量 |
|
||
|
||
---
|
||
|
||
## 二、验收判据(缺一不可)
|
||
|
||
读 `D:\SteamLibrary\steamapps\common\ForzaHorizon5\OptiScaler.log`:
|
||
|
||
1. `CheckWorkingMode OptiScaler working as dxgi.dll, system dll loaded`
|
||
2. `HookNgxApi NVSDK_NGX_XXXXXX_GetFeatureRequirements found, hooking!`
|
||
3. `DLSSFeatureDx12::InitDLSS _CreateFeature result: NVSDK_NGX_Result_Success`
|
||
4. **`DlssNr::EvaluateAfterUpscale DLSS-NR reached through the game's DLSS input`** ← 核心
|
||
5. `DlssNr_Dx12::Dispatch DLSS-NR running at 2560x1440`
|
||
6. 进程模块表里出现 **两个 `dxgi.dll`**(游戏目录的 OptiScaler + 系统 dxgi)
|
||
7. 无 `Application Hang` / `Application Error`
|
||
|
||
---
|
||
|
||
## 三、已解决的故障(都有实证,不必再走)
|
||
|
||
### 3.1 启动后「未响应」→ `Application Hang`
|
||
|
||
```
|
||
OptiInput::InstallWindowSubclass subclass installed previousWndProc:… → optiWndProc:…
|
||
OptiInput::InstallHooks Win32 message / key state / GetMessagePos / clip cursor /
|
||
HID / **raw input** / windows input / position input hooks installed
|
||
OptiInput::UpdateXInputIntegrationLocked XInput hooks installed
|
||
… 之后 Windows 记录 Application Hang,游戏被关闭
|
||
```
|
||
|
||
OptiScaler 给游戏主窗口挂了**子类化窗口过程**并装了 **raw input + XInput 钩子**,
|
||
而地平线是重度输入的游戏 → 消息泵被卡住。
|
||
|
||
**修法(两个一起,实测有效)**:
|
||
```ini
|
||
[Hotfix] ManualInputPolling=true ; 不去 hook WndProc,改成自己轮询输入
|
||
[Menu] OverlayMenu=false ; 关掉覆盖层
|
||
```
|
||
|
||
### 3.2 在菜单里切到 FSR → 游戏崩溃
|
||
|
||
```
|
||
21:59:08 FeatureProvider_Dx12::ChangeFeature changing backend to FSR 2.2.1
|
||
21:59:11 Application Error: ForzaHorizon5.exe 0xc0000005 偏移 0x92dfbc
|
||
```
|
||
**不要在地平线里实时切后端。** 要换就改 ini 再重启(而且 `Dx12Upscaler` 必须是 `dlss`,
|
||
否则神经通路没有游戏自己的 DLSS 可骑)。
|
||
|
||
### 3.3 遗留:菜单显示得出,但收不到输入
|
||
|
||
```
|
||
[W] OptiInput::LogInputHealthSnapshotLocked menu is visible but no window/queue/raw input
|
||
was received this frame. input:0x…, foreground:0x…, focused:yes, subclassed:yes.
|
||
```
|
||
菜单能唤出(`menu visibility changed 0 -> 1`),但鼠标键盘进不去。
|
||
**不影响神经渲染**,所有参数都从 ini 调、改完重启游戏即可。
|
||
|
||
### 3.4 游戏自身的帧生成在报错(与 OptiScaler 无关)
|
||
|
||
```
|
||
[E] present.h:288[updateStatus] eDLSSGStatusFailReflexNotDetectedAtRuntime
|
||
- sl.reflex must be enabled and active
|
||
```
|
||
游戏自己的 DLSS-G 处于失败状态。**「远处物体闪动」很可能来自这里** ——
|
||
建议在游戏画面设置里关掉帧生成,或把 Reflex 打开。
|
||
|
||
### 3.5 左上角两个重叠的 FPS 数字
|
||
|
||
不是 OptiScaler 的(`ShowFps=auto`=关)。是 **NVIDIA App 的性能叠加(绿色)** 与
|
||
**Steam 的游戏内 FPS 显示** 都默认在左上角。关掉其中一个即可。
|
||
|
||
---
|
||
|
||
## 四、调参对照表(全部来自 ini 里的原文说明)
|
||
|
||
| 键 | 含义 | 方向 |
|
||
|---|---|---|
|
||
| `TransferStrength` | **Detail strength**:0 = 超分器原样(真旁路)→ 1 = 模型的画面 → >1 超出模型本意 | ↓ 降噪/压远处闪动 |
|
||
| `ColourStrength` | **Colour strength**:0 = 完全保留游戏颜色、只让亮度带模型判断;1 = 连模型颜色一起用 | ↓ 去色彩噪点 |
|
||
| `MaxRatio` | **Highlight guard**(默认 2.0x):限制这一遍最多提亮多少倍 | 2x 说明书说已足够 |
|
||
| `WorkingScale` | 模型工作分辨率,**画面本身不降**,开销按平方走;**>1.0 超采样在 D3D12 可用**(终末地 D3D11 上不可用) | ↓ 变软/省开销 |
|
||
| `ScalingDownscaler` | 只在 `WorkingScale>1.0` 时用 | 上采样时再动 |
|
||
| `DebugView` | 0 关 / 1 模型看到的 / 2 模型原始答案 / **3 改动量放大 20 倍** | 灰屏 = 模型没在改 |
|
||
| `AutoCapture` | 写 `dlssnr-capture` 前后对比帧 | 实测未触发 |
|
||
| `Intensity` / `Preset` / `Style` / `Local*` | NVIDIA 自己的参数;`Preset` 改动需重启 | |
|
||
|
||
---
|
||
|
||
## 五、回滚
|
||
|
||
```powershell
|
||
& 'E:\deepseek\_tmp\feedkit\revert-forza.ps1'
|
||
```
|
||
按安装清单精确删除(12 个文件),并与安装前快照交叉核对。
|
||
上一轮的 ReShade / DFC 残留保留在 `E:\deepseek\game-backups\ForzaHorizon5\leftovers-*\`。
|
||
|
||
---
|
||
|
||
## 六、与终末地的差异对照
|
||
|
||
| | 终末地 | 地平线 5 |
|
||
|---|---|---|
|
||
| 反作弊 | **ACE** → 目录代理会被 `ACE-Setup64.exe` / `PlatformProcess.exe` 等吞掉 | **无** → 目录代理最简形态即可 |
|
||
| 注入方式 | 外部注入(`injector.exe`,只进 Endfield.exe) | 目录代理 `dxgi.dll` |
|
||
| 渲染 API | 只有 D3D11 / Vulkan(**没有 D3D12 后端**) | D3D12 |
|
||
| 超分器键 | `Dx11Upscaler=dlss_12`(dx11on12,**D3D11 上唯一能跑神经渲染的选项**) | `Dx12Upscaler=dlss` |
|
||
| 超采样 `WorkingScale>1` | 不可用 | **可用** |
|
||
| Smooth Motion | 必须为 Vulkan 关掉 | 无此约束 |
|
||
| 启动 | 桌面 `终末地-DLSS5启动.bat`(含提权) | Steam 正常启动 |
|
||
| 坑 | 目录代理污染 ACE 进程 | 窗口子类化 + raw input 钩子卡死消息泵 |
|
||
|
||
---
|
||
|
||
## 七、产物清单
|
||
|
||
| 文件 | 作用 |
|
||
|---|---|
|
||
| `E:\deepseek\_tmp\feedkit\forza-install-optiscaler.ps1` | 安装脚本 |
|
||
| `E:\deepseek\_tmp\feedkit\revert-forza.ps1` | 回滚脚本 |
|
||
| `E:\deepseek\_tmp\feedkit\OptiScaler-DLSSNR-v0.2.0.zip` | 原料(124 MB,SHA256 `8EECE7A4D7DE6DE5917F0C99AC60540B2D77022E7699BBA717B0A6D9E1829BCE`) |
|
||
| `E:\deepseek\game-backups\ForzaHorizon5\` | 证据:`hang-run-*\`(含 Application Hang 事件)、`OptiScaler.ini` 各阶段备份、安装清单、安装前快照、`leftovers-*\` |
|