Skip to content

基于 D3D12 的渲染器#1348

Open
Blinue wants to merge 186 commits into
devfrom
d3d12
Open

基于 D3D12 的渲染器#1348
Blinue wants to merge 186 commits into
devfrom
d3d12

Conversation

@Blinue

@Blinue Blinue commented Dec 10, 2025

Copy link
Copy Markdown
Owner

这个 PR 用于跟踪开发进度和收集反馈。有以下几个目标:

  • 支持 WCG 和 HDR HDR support #55
    • 支持 SDR、WCG 和 HDR 之间无缝切换
    • 支持 SDR/WCG 转 HDR(使用着色器或 RTX Video HDR 等插件)
    • 正确处理色域转换。有些效果只支持 SDR,如何处理 WCG/HDR 是个问题
  • 渐进式编译效果
    • 正在编译时以 Bicubic 代替,编译完成后替换
  • 改进跨适配器捕获
    • 自动选择最快的中转方式
    • 所有捕获方式都支持跨适配器
  • 中途改变效果
  • 提高渲染管线的并行度
    • 设计为在使用重量级着色器时提高 GPU 利用率,不会牺牲延迟
    • 新架构下生产者(后端)和消费者(前端)共用环形缓冲区,比旧架构减少两次复制
  • 通过资源别名降低中间纹理的显存占用
  • TDR 恢复
  • 优化光标绘制

MagpieFX 的变化

通用

  1. 版本号更新为 5,不再兼容 4。
  2. 要求文件必须使用 UTF-8 without BOM 编码。
  3. 如果显卡支持 shader model 6.0 将使用 DXC 编译,否则使用 FXC 编译。
  4. 如果显卡支持,MF 会被定义成 float16_t 的别名。
    • 如果显卡支持原生 16 位标量(D3D12_FEATURE_DATA_D3D12_OPTIONS4::Native16BitShaderOpsSupported),MF 是 float16_t 的别名
    • 否则如果显卡支持 min16float(D3D12_SHADER_MIN_PRECISION_SUPPORT::D3D12_SHADER_MIN_PRECISION_SUPPORT_16_BIT),MF 是 min16float 的别名
    • 否则 MF 是 float 的别名
  5. 编译着色器时使用 -ffinite-math-only 标志,因此禁止使用 NaN 和 Inf。

指令

  1. //!CAPABILITY AdvancedColor:声明效果支持 WCG 和 HDR。默认情况下效果工作在无伽马校正的 sRGB 色彩空间,激活 WCG/HDR 后效果工作在 scRGB 色彩空间。
    • 写入 OUTPUT 前不要使用 saturate 函数,sRGB 下 OUTPUT 纹理是 UNORM 格式,将自动截断;WCG/HDR 下截断会丢失广色域和高动态范围。
  2. 不再支持 //!USE MulAdd:现在 MulAdd 始终可用
  3. 重新支持 //!USE Dynamic
  4. //!MIN_FRAME_RATE:指定最低帧率。
    • 有多个效果使用这个指令时取最高的
    • 设置了全局最低帧率时取更高的
    • 如果设置了最高帧率,不合法的最低帧率将被忽略
  5. //!SCALE_FACTOR:对输入的缩放倍数,必须为整数。不指定或值为 0 表示支持自由缩放。OUTPUT 纹理不再支持指定尺寸,现在 OUTPUT 和 INPUT 一样是可选的。
  6. //!PARAMETER:支持把参数定义成 uint。
  7. //!TEXTURE
    • 新增格式 COLOR_SPACE_ADAPTIVE,它在不同色彩空间下提供不同的精度,可以认为这是 INPUT 和 OUTPUT 的格式。不能和 SOURCE 同时使用。
    • 如果指定了 SOURCE 则也必须指定 FORMAT,过去这是可选的。从 DDS 加载时格式必须匹配,从图片加载时只支持 R8G8B8A8_UNORM、R16G16B16A16_FLOAT 和 R32G32B32A32_FLOAT。如果图片是 sRGB 会执行伽马解码。
    • 从 DDS 加载时将忽略 mipmap。
  8. //!COMMON:现在只允许存在一个 COMMON 块。

  1. MP_CS_LINEAR_SRGB、MP_CS_SCRGB:表示当前色彩空间
  2. MP_SM_6_0、MP_SM_6_1 等:表示是否支持特定 shader model。不存在 MP_SM_5_1,因为 D3D12 始终支持 SM 5.1

内置函数

  1. GetMaxLuminance 和 GetSdrWhiteLevel:HDR 下的最大亮度和 SDR 内容亮度,1.0 表示 80 尼特。只在 WCG/HDR 模式下可用(即已定义 MP_CS_SCRGB 宏),WCG 下这两个函数固定返回 1.0。
  2. EncodeSrgb 和 DecodeSrgb:用于 sRGB 的伽马校正。
  3. GetLuminance:计算 linear sRGB 的亮度。
  4. GetFrameCount 和 GetTimestamp:获取当前帧数和时间戳,只在声明 //!USE Dynamic 后可用。

@Blinue

Blinue commented Apr 9, 2026

Copy link
Copy Markdown
Owner Author

各个效果对 WCG/HDR 的支持情况

✔:原生支持
🟢:通过压缩亮度实现支持
🟢🟢:本身不支持,通过包装器实现支持(压缩亮度和色度)
❌:尚不支持

效果 支持情况
Nearest
Bilinear
Bicubic
Lanczos
Jinc
SGSR
ACNet
AdaptiveSharpen
SMAA 族
NIS
SSimDownscaler
Deband

@rampaa rampaa mentioned this pull request Apr 12, 2026
@Blinue

Blinue commented Apr 14, 2026

Copy link
Copy Markdown
Owner Author

旧文件结构

程序根目录(工作目录)
   ├── cache/
   ├── config(仅限便携模式)
   │     └── config.json
   ├── effects/
   ├── logs/
   ├── sources/
   ├── update/(仅限更新时)
   ├── Magpie.exe
   ├── Microsoft.UI.Xaml.dll
   ├── resources.pri
   ├── TouchHelper.exe
   └── Updater.exe

%LocalAppData%\Magpie(仅限非便携模式)
     └── config
           ├── v2
           │   └── config.json
           ├── v3
           │   └── config.json
           ├── v4
           │   └── config.json
           └── config.json(v1 配置文件)

新文件结构

程序根目录
   ├── app
   │    ├── D3D12/
   │    ├── effects/(内置效果)
   │    ├── dxcompiler.dll
   │    ├── dxil.dll
   │    ├── Microsoft.UI.Xaml.dll
   │    └── TouchHelper.exe
   ├── data(仅限便携模式,便携模式工作目录)
   │     ├── cache/
   │     ├── config
   │     │     └── config.json
   │     ├── effects/(自定义效果)
   │     ├── logs/
   │     └── sources/
   ├── update/(仅限更新时)
   ├── Magpie.exe
   ├── resources.pri(由于 XAML Islands 的限制无法移到 app 文件夹)
   └── Updater.exe(由于更新机制的限制无法移到 app 文件夹)

%LocalAppData%\Magpie(仅限非便携模式)
     └── data(非便携模式工作目录)
          ├── cache/
          ├── config
          │     └── config.json
          ├── effects/(自定义效果)
          ├── logs/
          └── sources/

@hooke007

Copy link
Copy Markdown
Collaborator

感觉现在如果外部效果支持hdr的话会很复杂。一些锐化算法里的魔法数字阈值看上去就是sdr下不断试错得出来的。大部分的超分算法都是在sdr训练集下产出的。着色器内部一个一个修改匹配hdr感觉不太现实,只能肉眼验收有没有明显错误

@Blinue

Blinue commented Apr 16, 2026

Copy link
Copy Markdown
Owner Author

感觉现在如果外部效果支持hdr的话会很复杂。一些锐化算法里的魔法数字阈值看上去就是sdr下不断试错得出来的。大部分的超分算法都是在sdr训练集下产出的。着色器内部一个一个修改匹配hdr感觉不太现实,只能肉眼验收有没有明显错误

我打算创建包装器压缩亮度和色度然后还原。FSR 有个可逆的色调映射算法供参考
https://github.com/GPUOpen-Effects/FidelityFX-FSR/blob/a21ffb8f6c13233ba336352bdff293894c706575/ffx-fsr/ffx_fsr1.h#L1030

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

显示器DPI不一致时光标大小有问题

3 participants