如何在 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-DriverOBS 预览、直播弹幕、代码窗口全挤在一块屏上AltTab 切到手指发酸无头服务器没接显示器图形会话却一个都开不了。Virtual-Display-Driver 正是为此而生的开源 Windows 虚拟显示器驱动基于微软 IddCx 框架它无需任何物理屏幕就能在 Windows 10/11 上创建出被系统完整识别的虚拟显示器支持自定义分辨率、高刷新率与 HDR 输出OBS、VR、Sunshine、远程桌面都能把它当成一块真屏来用。虚拟显示器在 Windows 眼里到底是什么它解决的问题很多用户以为虚拟显示器只是桌面多出一块区域实际上难点在于——Windows 的显示子系统只信任由显示驱动创建的监视器对象。软件分屏工具造不出独立显示设备OBS、VR 头显这类应用自然看不见它远程桌面的虚拟屏又绑死在网络栈上延迟高、配置繁琐。Virtual-Display-Driver 走的是一条正路在显示驱动层注册一块合规的虚拟监视器。它怎么做到项目核心是一个基于IddCx 1.10Indirect 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.10HDR 支持从 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 给一块显示器提供什么分辨率、刷新率、色域全部依据它出厂时烧录的 EDIDExtended 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 CustomEdidfalse/CustomEdid !-- 改为 true 即读取 user_edid.bin -- PreventSpooffalse/PreventSpoof EdidCeaOverridefalse/EdidCeaOverride /edid !-- 路线二EDID 集成系统用结构化 profile 自动派生模式与 HDR 元数据 -- edid_integration enabledfalse/enabled auto_configure_from_edidfalse/auto_configure_from_edid edid_profile_pathEDID/monitor_profile.xml/edid_profile_path fallback_on_errortrue/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 HDR10Supportedtrue/HDR10Supported MaxLuminance1670.838/MaxLuminance MinLuminance10.615/MinLuminance /HDRCapabilities PreferredMode Width4096/WidthHeight2160/HeightRefreshRate59.940/RefreshRate /PreferredMode驱动源码中对应GenerateModesFromEdid()、ConvertChromaticityToSmpte()等函数加载失败时按fallback_on_error回退到手动配置不会让系统卡死在枚举阶段。多显卡渲染分配GPU 选择与帧处理机制它解决的问题独显核显的笔记本、多卡工作站上虚拟屏到底由哪张卡渲染直接决定性能。选错卡比如落到核显会让高刷 4K 直接掉帧。它怎么做到渲染设备按LUIDGPU 的唯一标识管理。Driver.h/MttVDD/Driver.h) 里的Direct3DDevice封装了 DXGI 工厂、适配器和 D3D11 设备驱动用GetOrCreateDevice(RenderAdapter)为每块卡懒创建并缓存进s_DeviceCache周期性调用CleanupExpiredDevices()回收失效卡热拔独显、切换显卡模式的场景。帧的流转由SwapChainProcessor线程完成它阻塞等待 IddCx 交换链的新帧事件取到 surface 后立刻处理并调用IddCxSwapChainFinishedProcessingFrame()归还——这段循环是驱动里性能最敏感的部分代码注释明确提示此处应保持最轻的 GPU 拷贝路径。指定渲染卡的入口在 XML 中gpu friendlynamedefault/friendlyname !-- 默认自动选择填显卡名可锁定某块 GPU -- /gpu改完无需重启系统——驱动通过命名管道对外提供日志与命令通道SendLogsThroughPipe开启后支持GETALLGPUS、GETASSIGNEDGPU、SETGPU、IDDCXVERSION等指令SETGPU会直接把新卡名写回 XML 并热重载驱动。社区脚本正是走这条通道实现的位于 Community Scripts/ 目录changeres-VDD.ps1—— 运行时热切虚拟屏分辨率refreshrate-VDD.ps1—— 校验安全清单后改刷新率30–500Hzrotate-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 平台尤其有用。安装实操从一键命令到源码编译三种路线按动手意愿深浅排列任选其一路线 Awinget 一键安装推荐新手winget install --idVirtualDrivers.Virtual-Display-Driver -e路线 BPowerShell 静默安装。以管理员身份运行 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 count1/count !-- 同时创建几块虚拟屏 -- /monitors global g_refresh_rate60/g_refresh_rate g_refresh_rate144/g_refresh_rate g_refresh_rate240/g_refresh_rate !-- 全局可选刷新率 -- /global colour SDR10bitfalse/SDR10bit HDRPlusfalse/HDRPlus !-- 开启 10bit HDR 通路 -- ColourFormatRGB/ColourFormat !-- 可选 YCbCr444/422/420 -- /colour cursor HardwareCursortrue/HardwareCursor !-- 硬件光标降低 CPU 负载 -- /cursor几个容易踩的细节HDR10 静态元数据最大/最小亮度、MaxCLL在hdr_advanced段默认enabledfalse配合 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 下独有的 HDR10/12bit、小数刷新率与 ARM64 支持真·显示设备完整 EDID 机制让 OBS、VR、Sunshine、远程桌面都按物理屏对待它可定制纵深足够从换一份 EDID、锁一张渲染卡到逐帧管线调优全在配置和源码层可触达签名 社区脚本SignPath 签名免测试签名十几枚 PowerShell 脚本覆盖日常运维动手清单用winget install --idVirtualDrivers.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),仅供参考