- 音视频
- 图形学
- 桌面应用
【免费下载链接】t3
TiXL is an open source software to create realtime motion graphics.
ScreenCapture 是 TiXL 图形化编程框架中位于Lib.io.video命名空间的屏幕捕获运算符,它能够像 OBS(Open Broadcaster Software)一样加载并渲染整个屏幕的内容,输出为可直接接入渲染管线的Texture2D。在实时动效创作中,它常用于录制 TiXL 自身 UI、配合 ScreenCloseUp 模拟“真实摄像机拍摄显示器”的视觉错觉,以及为捕获画面叠加 Pixelate、SortPixel 等 2D 特效。读完本文,你将掌握 ScreenCapture 的参数含义、底层 DXGI 实现原理及其在项目中的典型组合用法。
功能概述:一个可以接入渲染图的“屏幕源”
ScreenCapture 在 TiXL 运算符体系中扮演着“输入源(Source)”的角色:它不产生几何体,也不做图像处理,而是把操作系统层面的整块屏幕内容转成一个可继续向下游传递的纹理。官方描述将其定位为“类似 OBS 的屏幕捕捉软件”,因此它天然适合需要把桌面画面当作素材来驱动动效的场景。
从运算符库的归属来看,它收录于 Lib.io.video 命名空间,与 NdiInput、SpoutInput、VideoDeviceInput 等视频/图像输入类运算符并列,共同构成 TiXL 的“外部画面接入”能力家族。
输入参数详解
ScreenCapture 只暴露两个输入参数,接口非常精简,官方文档定义如下:
| 名称 | 类型 | 说明 |
|---|---|---|
| ScreenIndex | Int32 | 指定录制哪一块屏幕(例如多显示器系统) |
| TimeOut | Int32 | 定义超时时间 |
从运算符定义文件 ScreenCapture.t3 可以看到,两个输入在图形化界面中均已提供默认值:
- ScreenIndex 默认值为 0:即默认捕获主显示器。在多显示器环境下,可以通过切换该值选择其他输出。
- TimeOut 默认值为 0:对应底层桌面复制 API 的等待超时(毫秒级)。值为 0 时表示尝试立即抓取一帧,不阻塞等待新帧。
参数含义可以在仓库内的 ScreenCapture 源码中得到印证——Update方法中分别通过ScreenIndex.GetValue(context)与TimeOut.GetValue(context)读取这两个输入,并直接将其传递给底层的屏幕复制调用(详见下文实现原理一节)。
输出
| 名称 | 类型 |
|---|---|
| TextureOutput | T3.Core.DataTypes.Texture2D |
ScreenCapture 只有一个输出TextureOutput,类型为标准 2D 纹理。该输出声明了DirtyFlagTrigger = DirtyFlagTrigger.Always(见源码第 10 行),意味着它每帧都会被强制更新,从而保证桌面画面能以实时帧率持续流入渲染管线——这正是“实时动效”场景所必需的行为。下游任何接受Texture2D的运算符(如 2D 特效、混合节点、输出节点)都可以直接消费这个输出。
源码级实现原理:DXGI Desktop Duplication API
ScreenCapture 的底层实现并不依赖 GDI 位图抓屏,而是使用 DirectX 的桌面复制(Desktop Duplication)机制,这是 Windows 上高效获取屏幕帧的标准方案。完整实现位于 ScreenCapture.cs,核心调用链可以概括为:
DXGI Device ──QueryInterface──> DXGI.Device ──GetParent──> DXGI.Adapter ──GetOutput(ScreenIndex)──> Output ──QueryInterface──> Output1 ──DuplicateOutput(device)──> OutputDuplication ──TryAcquireNextFrame(TimeOut)──> 获取桌面纹理 ──CopyResource──> 拷贝到自建 ShaderResource 纹理 ──ReleaseFrame──> 释放帧几个值得关注的实现细节:
屏幕索引的取模处理:源码通过
Utilities.InfiniteModIndexer(screenIndex, dxgiAdapter.GetOutputCount())对屏幕索引做取模运算,因此即使传入超出显示器数量的索引(或负值),也会被安全地映射到有效输出上,不会越界崩溃。屏幕切换时的资源重建:
Update方法中缓存了_currentScreenIndex,当 ScreenIndex 输入发生变化时,会先释放旧的OutputDuplication对象再重建,避免跨显示器残留。纹理尺寸/格式自适应:当捕获到的桌面纹理分辨率或像素格式发生变化时(例如用户切换分辨率),代码会比较新旧纹理的
Width、Height、Format,不一致时自动重新创建目标纹理(源码第 50-56 行),保证输出始终与当前桌面状态匹配。资源生命周期管理:捕获到的桌面资源在
using块内完成查询、拷贝,最后通过Utilities.Dispose释放,并在运算符Dispose时统一回收_currentScreen与_dup,避免 GPU 资源泄漏。
典型应用场景与运算符组合
官方文档明确给出了三类高频用法,均以 ScreenCapture 的TextureOutput作为链路起点:
1. 录制 TiXL 自身的 UI(Render To File)
ScreenCapture 的输出可以被送入 TiXL 的Render To File窗口,将 TiXL 的界面渲染为文件或图像序列,从而得到一段 TiXL 操作过程的录屏。这在制作教学演示、演出彩排存档等场景中非常实用。Render To File 相关实现位于 Editor/Gui/Windows/RenderExport/RenderWindow.cs(同目录下还有 RenderProcess.cs 与 FfmpegVideoExportWriter.cs,负责视频编码与导出),可作为后续深入了解导出管线的入口。
2. 模拟“真实摄像机拍摄显示器”(ScreenCloseUp)
将 ScreenCapture 的画面喂给 ScreenCloseUp 运算符,它会把 2D 图像贴到 3D 场景中的虚拟 LCD/屏幕上,并通过虚拟相机参数(Zoom、Tilt、DepthOfField、Glossy、FogStrength 等)营造出“用真实摄像机拍摄显示器”的临场感。官方还建议进一步叠加 ChromaticAbberation、ColorGrade、Grain 等运算符来强化真实相机的质感。ScreenCloseUp 的实现位于 Operators/Lib/Symbols/image/fx/stylize/,其.t3ui文件明确注明“Works great with … ScreenCapture”。
3. 为捕获画面叠加 2D 特效
ScreenCapture 的输出是标准Texture2D,因此可以直接串联任意 2D 图像处理运算符,例如:
- Pixelate(马赛克):实现于 Operators/Lib/Symbols/image/fx/stylize/Pixelate.cs,可对桌面画面做像素化处理,常用于隐私遮挡或风格化表达。
- SortPixel(像素排序故障效果):对应运算符 Operators/Lib/Symbols/image/fx/glitch/SortPixelGlitch.cs,可以为捕获画面注入赛博故障风。
以 ScreenCapture 为源头,配合 TiXL 节点图的数据流连接方式,用户可以自由构建“桌面画面 → 特效 → 输出”的任意处理链路。
小结
ScreenCapture 是 TiXL 接入桌面画面的最直接入口:参数仅有 ScreenIndex 与 TimeOut 两个整数输入,输出为每帧强制更新的Texture2D;底层基于 DXGI Desktop Duplication 实现,具备屏幕切换自动重建、分辨率自适应、索引取模保护等健壮性设计。无论是用于录屏、模拟摄像机拍摄,还是作为 2D 特效的素材源,它都能以极低的接入成本融入 TiXL 的实时渲染流程。若想继续深入,可阅读 ScreenCapture.cs 的完整实现,或参考 Lib.io.video 运算符清单 中其他视频输入类运算符进行横向对比。
- 音视频
- 图形学
- 桌面应用
【免费下载链接】t3
TiXL is an open source software to create realtime motion graphics.
相关推荐
Electron屏幕捕获:实现屏幕截图与录屏功能
Electron屏幕捕获:实现屏幕截图与录屏功能 在桌面应用开发中,屏幕捕获是一个常见且重要的功能需求。无论是用于远程协助、教学演示、游戏录制还是应用监控,屏幕
桌面应用跨平台前端ScreenCapture:专业级屏幕捕获与标注工具完全指南
ScreenCapture:专业级屏幕捕获与标注工具完全指南 项目概述与技术架构 ScreenCapture是一款基于现代C++和Qt框架开发的高性能屏幕捕获工
桌面应用Ice屏幕捕获:ScreenCapture权限处理深度解析
Ice屏幕捕获:ScreenCapture权限处理深度解析 引言:macOS权限管理的核心挑战 在macOS生态系统中,屏幕捕获权限(Screen Record
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考