如何在 Windows 上凭空造出一块 HDR 虚拟显示器:Virtual-Display-Driver 驱动完全指南

发布时间:2026/11/6 8:48:10
如何在 Windows 上凭空造出一块 HDR 虚拟显示器:Virtual-Display-Driver 驱动完全指南

如何在 Windows 上凭空造出一块 HDR 虚拟显示器:Virtual-Display-Driver 驱动完全指南

【免费下载链接】Virtual-Display-DriverAdd virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software.项目地址: https://gitcode.com/gh_mirrors/vi/Virtual-Display-Driver

OBS 预览、直播弹幕、代码窗口全挤在一块屏上,Alt+Tab 切到手指发酸;无头服务器没接显示器,图形会话却一个都开不了。Virtual-Display-Driver 正是为此而生的开源 Windows 虚拟显示器驱动:基于微软 IddCx 框架,它无需任何物理屏幕,就能在 Windows 10/11 上创建出被系统完整识别的虚拟显示器,支持自定义分辨率、高刷新率与 HDR 输出,OBS、VR、Sunshine、远程桌面都能把它当成一块"真屏"来用。

虚拟显示器在 Windows 眼里到底是什么

它解决的问题:很多用户以为"虚拟显示器"只是桌面多出一块区域,实际上难点在于——Windows 的显示子系统只信任由显示驱动创建的监视器对象。软件分屏工具造不出独立显示设备,OBS、VR 头显这类应用自然看不见它;远程桌面的虚拟屏又绑死在网络栈上,延迟高、配置繁琐。Virtual-Display-Driver 走的是一条正路:在显示驱动层注册一块合规的虚拟监视器。

它怎么做到:项目核心是一个基于IddCx 1.10(Indirect Display Driver Class eXtension,微软间接显示驱动框架)的用户态驱动,源码集中在 Virtual Display Driver (HDR)/MttVDD/Driver.cpp/MttVDD/Driver.cpp)(约 5000 行),头文件见 Driver.h/MttVDD/Driver.h)。

"Indirect(间接)"是理解这套机制的钥匙:驱动自己不渲染任何像素,它只负责"宣布这块屏存在、它支持什么模式",真正的画面由 GPU 上的 D3D11 设备完成。类比一下,驱动是写字楼的前台管家,访客(桌面画面)登记入住后,真正干活的是楼里的租户(渲染 GPU),管家只管发证和登记。

创建监视器的核心调用只有两步——先建对象,再上报"插上了":

// 摘自 Virtual Display Driver (HDR)/MttVDD/Driver.cpp 的 CreateMonitor() IDDCX_MONITOR_INFO MonitorInfo = {}; MonitorInfo.MonitorType = DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI; MonitorInfo.MonitorDescription.Type = IDDCX_MONITOR_DESCRIPTION_TYPE_EDID; MonitorInfo.MonitorDescription.pData = s_KnownMonitorEdid.data(); // 附上 EDID"身份证" NTSTATUS Status = IddCxMonitorCreate(m_Adapter, &MonitorCreate, &MonitorCreateOut); // 创建成功后向系统报告"显示器已接入" Status = IddCxMonitorArrival(m_Monitor, &ArrivalOut);

之后 Windows 把它当成一块 HDMI 接口的真实显示器:显示设置里出现新屏幕,分辨率/刷新率选项从驱动注册的 EDID 与模式表生成(内置完整模式清单见 Virtual Display Driver (HDR)/option.txt/option.txt),从 640×480 一直排到 8640×3600)。

IddCx 版本决定能力上限。IddCx 是随 Windows 版本演进的:Win11 23H2/24H2 对应1.10(HDR 支持从 23H2 起可用),Win10 22H2 对应 1.5。仓库自带一个查询小工具 Virtual Display Driver (HDR)/GetIddCx/IddCxVersionQuery.cpp/GetIddCx/IddCxVersionQuery.cpp),逻辑是按系统 Build 号查版本表:

// 摘自 GetIddCx/IddCxVersionQuery.cpp 的版本映射 {26100, {"Windows 11 24H2", "1.10", 0x1A80}}, {22631, {"Windows 11 23H2", "1.10", 0x1A00}}, {19045, {"Windows 10 22H2", "1.5", 0x1500}},

想知道自己系统落在哪一档,跑一下目录里现成的IddCxVersionQuery.exe即可。

EDID 机制详解:给虚拟屏办一张"身份证"

它解决的问题:Windows 给一块显示器提供什么分辨率、刷新率、色域,全部依据它出厂时烧录的 EDID(Extended Display Identification Data)。没有 EDID,虚拟屏就只能用兜底的低清模式,HDR 能力更是无从谈起。

它怎么做到:EDID 可以理解为显示器的"身份证"——128 字节的结构化数据,记录厂商、型号、支持的时序和色彩能力。驱动里内置了一份默认 EDID(描述中写着VDD by MTT),同时开放了完整的自定义通道,配置文件是 Virtual Display Driver (HDR)/vdd_settings.xml/vdd_settings.xml),安装后位于系统路径C:\VirtualDisplayDriver\vdd_settings.xml。两条路线:

<!-- 路线一:直接换一份完整 EDID 二进制 --> <edid> <CustomEdid>false</CustomEdid> <!-- 改为 true 即读取 user_edid.bin --> <PreventSpoof>false</PreventSpoof> <EdidCeaOverride>false</EdidCeaOverride> </edid> <!-- 路线二:EDID 集成系统,用结构化 profile 自动派生模式与 HDR 元数据 --> <edid_integration> <enabled>false</enabled> <auto_configure_from_edid>false</auto_configure_from_edid> <edid_profile_path>EDID/monitor_profile.xml</edid_profile_path> <fallback_on_error>true</fallback_on_error> <!-- EDID 解析失败时回退手动设置 --> </edid_integration>

路线一适合手里已有一块真实显示器的 EDID 二进制文件;仓库的 Virtual Display Driver (HDR)/EDID//EDID/) 目录里备好了几份可直接启用的:

  • 8K240HzHDR.edid—— 8K 240Hz HDR 场景
  • digihome_edid.bin—— 4K 60Hz 家庭影院向
  • lolhero_edid.bin—— 2K 高刷电竞向
  • EDIDPardseDL.exe与edid_parser.txt—— 解析/核对 EDID 内容的辅助工具

路线二更适合从零"捏"一块屏:把EDID/下的 monitor_profile.xml/EDID/monitor_profile.xml) 指向给驱动后,它会自动完成三件事——从 profile 生成受过滤的显示模式列表、按min_refresh_rate/max_resolution_width等参数裁剪、并把亮度与色度数据换算成SMPTE ST.2086格式写进 HDR 元数据。以仓库自带 profile 为例:

<!-- 摘自 Virtual Display Driver (HDR)/EDID/monitor_profile.xml --> <HDRCapabilities> <HDR10Supported>true</HDR10Supported> <MaxLuminance>1670.838</MaxLuminance> <MinLuminance>10.615</MinLuminance> </HDRCapabilities> <PreferredMode> <Width>4096</Width><Height>2160</Height><RefreshRate>59.940</RefreshRate> </PreferredMode>

驱动源码中对应GenerateModesFromEdid()、ConvertChromaticityToSmpte()等函数,加载失败时按fallback_on_error回退到手动配置,不会让系统卡死在枚举阶段。

多显卡渲染分配:GPU 选择与帧处理机制

它解决的问题:独显+核显的笔记本、多卡工作站上,"虚拟屏到底由哪张卡渲染"直接决定性能。选错卡(比如落到核显)会让高刷 4K 直接掉帧。

它怎么做到:渲染设备按LUID(GPU 的唯一标识)管理。Driver.h/MttVDD/Driver.h) 里的Direct3DDevice封装了 DXGI 工厂、适配器和 D3D11 设备,驱动用GetOrCreateDevice(RenderAdapter)为每块卡懒创建并缓存进s_DeviceCache,周期性调用CleanupExpiredDevices()回收失效卡(热拔独显、切换显卡模式的场景)。帧的流转由SwapChainProcessor线程完成:它阻塞等待 IddCx 交换链的新帧事件,取到 surface 后立刻处理并调用IddCxSwapChainFinishedProcessingFrame()归还——这段循环是驱动里性能最敏感的部分,代码注释明确提示此处应保持最轻的 GPU 拷贝路径。

指定渲染卡的入口在 XML 中:

<gpu> <friendlyname>default</friendlyname> <!-- 默认自动选择;填显卡名可锁定某块 GPU --> </gpu>

改完无需重启系统——驱动通过命名管道对外提供日志与命令通道(SendLogsThroughPipe开启后),支持GETALLGPUS、GETASSIGNEDGPU、SETGPU、IDDCXVERSION等指令,SETGPU会直接把新卡名写回 XML 并热重载驱动。社区脚本正是走这条通道实现的,位于 Community Scripts/ 目录:

  • changeres-VDD.ps1—— 运行时热切虚拟屏分辨率
  • refreshrate-VDD.ps1—— 校验安全清单后改刷新率(30–500Hz)
  • rotate-VDD.ps1/scale-VDD.ps1—— 旋转与 DPI 缩放
  • primary-VDD.ps1—— 把虚拟屏设为主屏,无头机器串流/远程必备
  • toggle-VDD.ps1—— 一键启停驱动并在扩展/复制模式间切换
  • get_disp_num.ps1—— 按 WMI 中的MTT1337监视器标识查出该虚拟屏的适配器编号

与其他虚拟显示器方案的横向对比

仓库 README 维护了一张同生态方案的对照表,这是判断"为什么选它"最直接的依据:

项目IddCx 版本签名SDRHDR硬件光标可定制自定义 EDID小数刷新率
Virtual-Display-Driver (HDR)1.10(最新)✅✅(8/10bit)✅(10/12bit)✅✅✅✅
usbmmid_v2—✅✅(8bit)—————
virtual-display-rs1.5—✅(8bit)—✅✅——
parsec-vdd1.5✅✅(8bit)—✅✅——
lddSampleDriver1.2—✅(8bit)—————
RustDesklddDriver1.2—✅(8bit)—————

差异点集中在三处:IddCx 1.10 是新框架里唯一吃到最新能力的项目(HDR 10/12bit、ARM64 支持);驱动经过 SignPath 代码签名,Windows 可直接安装而不用开测试签名;自定义 EDID + 小数刷新率(59.94Hz 这类)让它能精确模拟特定型号的时序,对回放器和 VR 平台尤其有用。

安装实操:从一键命令到源码编译

三种路线按动手意愿深浅排列,任选其一:

路线 A:winget 一键安装(推荐新手)

winget install --id=VirtualDrivers.Virtual-Display-Driver -e

路线 B:PowerShell 静默安装。以管理员身份运行 Community Scripts/silent-install.ps1,脚本会自动下载 NefCon 与最新签名驱动、把 SignPath 证书导入TrustedPublisher存储、用MttVDD.inf完成安装并清理临时目录,全程无需图形界面。

路线 C:源码编译安装。仓库用 Git submodule 挂载微软 Windows Driver Frameworks 头文件(ThirdParty/Windows-Driver-Frameworks/),克隆时必须带上子模块:

git clone --recurse-submodules https://gitcode.com/gh_mirrors/vi/Virtual-Display-Driver
  1. 在 Visual Studio 中打开 Virtual Display Driver (HDR)/MttVDD/MttVDD.sln/MttVDD/MttVDD.sln) 并编译
  2. 以管理员身份运行发布包中的*.bat,把驱动证书加入受信任根证书
  3. 设备管理器 → 操作 → 添加旧式硬件 → 选 Display adapters → Have Disk 指向 MttVDD.inf/MttVDD/MttVDD.inf) 完成安装

装完做两处验证:设备管理器"显示适配器"下出现虚拟显卡;显示设置里出现新屏幕。前置依赖:确保安装了最新 Microsoft Visual C++ Redistributable,报vcruntime140.dll not found就是缺它。

配置调优:vdd_settings.xml 关键参数速查

仓库里的 vdd_settings.xml/vdd_settings.xml) 是"精简到只含有效项"的模板(注释标明原始文件 63 项中仅 52 项真正参与驱动逻辑),常用调优点:

<monitors> <count>1</count> <!-- 同时创建几块虚拟屏 --> </monitors> <global> <g_refresh_rate>60</g_refresh_rate> <g_refresh_rate>144</g_refresh_rate> <g_refresh_rate>240</g_refresh_rate> <!-- 全局可选刷新率 --> </global> <colour> <SDR10bit>false</SDR10bit> <HDRPlus>false</HDRPlus> <!-- 开启 10bit HDR 通路 --> <ColourFormat>RGB</ColourFormat> <!-- 可选 YCbCr444/422/420 --> </colour> <cursor> <HardwareCursor>true</HardwareCursor> <!-- 硬件光标,降低 CPU 负载 --> </cursor>

几个容易踩的细节:HDR10 静态元数据(最大/最小亮度、MaxCLL)在hdr_advanced段,默认enabled=false,配合 EDID profile 可自动生成;debuglogging打开后会生成非常大的日志文件,排障完记得关回false;注释中明确标注monitor_emulation等部分段落是"读了但没用"的死配置,改动它们不产生任何效果,别在上面浪费时间。

避坑指南:黑屏恢复、驱动更新冲突与常见报错

黑屏 3 步恢复法。最经典的事故是开机黑屏:Windows 重新枚举显示设备时可能把虚拟屏排到物理显示器前面,而虚拟屏背后没有真实屏幕,于是画面"发到了空气里"。恢复步骤:

  1. 强制关机 2–3 次直到进入 Windows 恢复环境,走"疑难解答 → 高级选项 → 启动设置 → 重启 → F4"进安全模式
  2. 安全模式下打开设备管理器 → 显示适配器 → 卸载 Virtual Display Driver
  3. 正常重启,之后按需重装

赶时间的话还有个快捷招:黑屏时按Win + P,连按方向键 ↓ 和回车循环切换投影模式,多数情况当场就有画面了。

更新 GPU/芯片组驱动前先卸 VDD。顺序固定为:卸载 VDD → 完成驱动更新 → 重装 VDD。跳过这一步是黑屏事故的主要来源,上面"3 步恢复"就是它的代价。

其他高频问题:

  • 启动报vcruntime140.dll not found→ 补装 Visual C++ Redistributable
  • 多卡机器GETALLGPUS里同一块卡出现两次 → 重复那条大概率就是驱动当前挂着的渲染卡
  • 修改 XML 后不生效 → 配置在驱动加载时读取,需重载驱动(社区脚本或重启驱动服务)

写在最后

  • 框架吃到最新:IddCx 1.10 下独有的 HDR(10/12bit)、小数刷新率与 ARM64 支持
  • 真·显示设备:完整 EDID 机制让 OBS、VR、Sunshine、远程桌面都按"物理屏"对待它
  • 可定制纵深足够:从换一份 EDID、锁一张渲染卡到逐帧管线调优,全在配置和源码层可触达
  • 签名 + 社区脚本:SignPath 签名免测试签名,十几枚 PowerShell 脚本覆盖日常运维

动手清单:

  1. 用winget install --id=VirtualDrivers.Virtual-Display-Driver -e装好第一块虚拟屏,并在显示设置里确认
  2. 打开C:\VirtualDisplayDriver\vdd_settings.xml,按自己的用途调整resolutions与g_refresh_rate
  3. 需要 8K/HDR 场景时,从EDID/目录取一份现成 profile 开启edid_integration
  4. 养成习惯:任何 GPU 大版本驱动更新前,先卸载再重装 VDD

【免费下载链接】Virtual-Display-DriverAdd virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software.项目地址: https://gitcode.com/gh_mirrors/vi/Virtual-Display-Driver

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考