如何在 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 版本 | 签名 | SDR | HDR | 硬件光标 | 可定制 | 自定义 EDID | 小数刷新率 |
|---|---|---|---|---|---|---|---|---|
| Virtual-Display-Driver (HDR) | 1.10(最新) | ✅ | ✅(8/10bit) | ✅(10/12bit) | ✅ | ✅ | ✅ | ✅ |
| usbmmid_v2 | — | ✅ | ✅(8bit) | — | — | — | — | — |
| virtual-display-rs | 1.5 | — | ✅(8bit) | — | ✅ | ✅ | — | — |
| parsec-vdd | 1.5 | ✅ | ✅(8bit) | — | ✅ | ✅ | — | — |
| lddSampleDriver | 1.2 | — | ✅(8bit) | — | — | — | — | — |
| RustDesklddDriver | 1.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- 在 Visual Studio 中打开 Virtual Display Driver (HDR)/MttVDD/MttVDD.sln/MttVDD/MttVDD.sln) 并编译
- 以管理员身份运行发布包中的
*.bat,把驱动证书加入受信任根证书 - 设备管理器 → 操作 → 添加旧式硬件 → 选 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 重新枚举显示设备时可能把虚拟屏排到物理显示器前面,而虚拟屏背后没有真实屏幕,于是画面"发到了空气里"。恢复步骤:
- 强制关机 2–3 次直到进入 Windows 恢复环境,走"疑难解答 → 高级选项 → 启动设置 → 重启 → F4"进安全模式
- 安全模式下打开设备管理器 → 显示适配器 → 卸载 Virtual Display Driver
- 正常重启,之后按需重装
赶时间的话还有个快捷招:黑屏时按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 脚本覆盖日常运维
动手清单:
- 用
winget install --id=VirtualDrivers.Virtual-Display-Driver -e装好第一块虚拟屏,并在显示设置里确认 - 打开
C:\VirtualDisplayDriver\vdd_settings.xml,按自己的用途调整resolutions与g_refresh_rate - 需要 8K/HDR 场景时,从
EDID/目录取一份现成 profile 开启edid_integration - 养成习惯:任何 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),仅供参考