Browse by type

基于 Eric Bruneton 黑洞着色器的 Windows 桌面黑洞可视化程序。捕获桌面画面,实时渲染史瓦西黑洞的引力透镜、吸积盘、光子环等相对论效应。
技术细节(空闲检测原理、双进程设计、WGC vs DXGI、D3D11 实验、已知问题等)请参见 TECHNICAL.md。
目前新功能还在开发中,新UI已完成, 旧UI仍可使用。 发布版本在release.zip里。 作者最近比较忙,更新会比较慢。
| 要求 | 说明 |
|---|---|
| 最低 | Windows 10 1803+ (build 17134),64 位 |
| 推荐 | Windows 11 22H2+ (build 22621) |
Win10 1803 是 WGC (
Windows.Graphics.Capture) 的最低版本。Win11 22H2 额外支持IsBorderRequired(false)进一步抑制黄边框。
当前渲染路径:WGC 桌面捕获 → CPU 回读 → OpenGL 3.3 渲染。WGC 内部依赖 D3D11,但程序本身不做 D3D11 渲染。
| 厂商 | 系列 | 兼容性 | 备注 |
|---|---|---|---|
| NVIDIA | GeForce GTX 400 系列及以上 (2010+) | ✅ 完全支持 | Fermi 架构起支持 OpenGL 3.3 |
| AMD | Radeon HD 7000 系列及以上 (2012+, GCN) | ✅ 完全支持 | GCN 第一代起支持 |
| Intel | Arc 独显系列 | ✅ 完全支持 |
| 厂商 | 系列 | 兼容性 | 备注 |
|---|---|---|---|
| Intel | HD Graphics 4000 及以上 (2012+, Ivy Bridge) | ✅ 可用 | OpenGL 驱动偶有小问题,ImGui 已内置 Intel 兼容处理 |
| Intel | UHD / Iris Xe (2017+) | ✅ 良好 | |
| AMD | Radeon Vega 核显 (Ryzen 2000+) | ✅ 良好 | |
| AMD | RDNA2/3 核显 (Radeon 680M/780M) | ✅ 良好 |
| 类型 | 兼容性 | 说明 |
|---|---|---|
| NVIDIA Optimus(Intel 核显 + NVIDIA 独显) | ✅ 可用 | CPU 回读路径天然隔离 GPU 差异,不依赖 GPU 间纹理共享 |
| AMD Switchable Graphics(核显 + AMD 独显) | ✅ 可用 | 同上 |
| 纯集显笔记本 | ✅ 良好 | 单一 GPU,无需协调 |
混合显卡下 D3D11 设备默认创建在核显上(WGC 内部需要),OpenGL 渲染在系统默认 GPU。数据经 CPU 中转,不依赖跨 GPU 纹理共享。
| 程序 | 依赖 |
|---|---|
blackhole.exe |
无额外依赖,静态链接 |
appBlakholeUI.exe |
Qt 6.8+ 运行时 DLL(release/ 已附带) |
| 工具 | 版本 | 用途 |
|---|---|---|
| MSYS2 | 最新 | UCRT64 编译环境 |
| GCC | 12+ (mingw-w64-ucrt-x86_64-gcc) |
C++17 编译 |
| CMake | 3.20+ | 构建系统 |
| GLFW3 | 3.3+ (pacman -S mingw-w64-ucrt-x86_64-glfw) |
窗口/输入(ImGui 用) |
| Qt 6 | 6.8+ (qt6-base, qt6-declarative) |
仅 Blakhole_UI 需要 |
Blakhole_UI\release\appBlakholeUI.exe(release\blackhole.exe为旧版UI)| 模式 | 行为 |
|---|---|
| 始终显示 | 黑洞常驻桌面 |
| 空闲检测 | 空闲 N 秒后显示,活跃时自动隐藏 |
空闲时间在配置页面设置(默认 300 秒)。支持三层检测:D3D 全屏检测、窗口尺寸检测、音视频进程名单匹配。
| 程序 | 技术栈 | 用途 |
|---|---|---|
blackhole.exe |
C++17 / OpenGL+WGL / ImGui | 原始实现:桌面黑洞渲染 + ImGui 配置面板 |
Blakhole_UI/appBlakholeUI.exe |
Qt6 QML / OpenGL FBO | 新版 UI:可视化配置 + 实时预览 + 进程管理 |
| 文件 | 功能 |
|---|---|
src/main.cpp |
主入口,双进程架构、shader 编译、uniform 注入、空闲检测 |
src/win32_gl.cpp/h |
Win32+WGL 原生窗口(替代 GLFW) |
src/capture_wgc.cpp/h |
WGC 桌面捕获(默认捕获方案) |
src/gl_texture.cpp/h |
D3D11→OpenGL 纹理上传 |
src/gui_config.cpp/h |
ImGui 配置面板(旧版 UI) |
src/imgui/ |
Dear ImGui 库 |
blackhole.glsl |
核心黑洞着色器(运行时字符串替换) |
shaders/vert.glsl |
OpenGL 顶点着色器 |
shaders/frag_desktop_header.glsl |
桌面版 uniform 声明 |
shaders/frag_preview_header.glsl |
预览版 uniform 声明 |
shaders/blackhole_preview.glsl |
预览版着色器(Blakhole_UI FBO 用) |
| 文件 | 说明 |
|---|---|
src/capture_dxgi.cpp/h |
DXGI Duplication 备用捕获。存在 INVALID_CALL 问题,保留供未来修复 |
src/d3d11_renderer.cpp/h |
D3D11 渲染器。因 WGC 纹理池化+GPU 异步导致画面冻结,已回退 |
src/win32_window.cpp/h |
纯 Win32 窗口(配合 D3D11 路径) |
src/renderer_interface.h |
IRenderer 抽象接口(OpenGL/D3D11 双路径预留) |
src/texture_source.h |
ITextureSource 纹理源抽象(面向未来扩展) |
shaders/blackhole.hlsl |
HLSL 翻译(D3D11 路径) |
shaders/fullscreen_vs.hlsl |
D3D11 全屏顶点着色器 |
| 目录 | 内容 |
|---|---|
src/ |
blackhole.exe 源代码 |
shaders/ |
GLSL/HLSL 着色器 |
Blakhole_UI/ |
Qt6/QML 新版配置面板(独立 CMake 项目) |
Doc/ |
技术文档 |
build/ |
blackhole.exe 构建输出 |
release/ |
发布目录(exe + DLL + shaders) |
.vscode/ |
VS Code 配置 |
# 使用 MSYS2 UCRT64
.\build_blackhole.ps1
# 或 CMake
cmake -B build -G "MinGW Makefiles"
cmake --build build
D3D11 路径可通过 CMakeLists.txt 取消注释以下行启用:
target_compile_definitions(blackhole PRIVATE BLACKHOLE_USE_D3D11)
| 组件 | 技术 | 说明 |
|---|---|---|
| 桌面捕获 | Windows Graphics Capture (WGC) | 通过 D3D11 设备捕获 DWM 合成快照 |
| 纹理传输 | CPU 回读 (Staging → Map → glTexSubImage2D) |
跨厂商兼容,隔离 GPU 差异 |
| 渲染 | OpenGL 3.3 + WGL | 原生 Win32 窗口,全屏顶层覆盖 |
| 配置面板(旧) | ImGui | blackhole.exe 内置 |
| 配置面板(新) | Qt 6 + QML | Blakhole_UI,独立进程,含实时 FBO 预览 |
| 构建 | MinGW-w64 (UCRT64) + CMake |
DXGI Duplication 和 D3D11 渲染器代码保留在仓库中,当前未启用。详见 TECHNICAL.md。
Eric Bruneton's black hole shader (BSD-3-Clause)
MIT — 见 LICENSE
$ claude mcp add ghostty-blackhole-main \
-- python -m otcore.mcp_server <graph>