UWP C++/CX中如何从SoftwareBitmap创建Direct3D11CaptureFrame?
从SoftwareBitmap创建带Surface的Direct3D11CaptureFrame?
直接创建Direct3D11CaptureFrame不可行
Direct3D11CaptureFrame是Windows图形捕获框架内部生成的对象,没有公开的构造函数或创建方法,无法直接从SoftwareBitmap实例化这个类。它的Surface是系统捕获流程中绑定的Direct3D资源,和捕获会话的上下文强关联,外部代码无法手动构造出符合框架要求的Direct3D11CaptureFrame实例。
针对水印录制需求的替代方案
你的核心需求是在捕获录制时给帧添加水印,不需要构造Direct3D11CaptureFrame,推荐以下两种更高效的处理方式:
方案一:GPU端直接处理Surface(性能优先)
避免将Surface转换到CPU端的SoftwareBitmap(会带来额外的内存拷贝和性能开销),直接在GPU上操作捕获到的Surface:
- 从
Direct3D11CaptureFrame.Surface获取对应的ID3D11Texture2D接口 - 创建Direct2D设备上下文,将该纹理设置为渲染目标
- 使用Direct2D的API直接在渲染目标上绘制水印(文本、图像均可)
- 处理后的纹理可直接传入录制组件(比如
MediaCapture或自定义编码器)
方案二:将处理后的SoftwareBitmap转回Direct3D纹理
如果已经在CPU端通过SoftwareBitmap完成了水印处理,需要将其转换为Direct3D纹理后再用于录制:
- 创建与
SoftwareBitmap像素格式、尺寸匹配的ID3D11Texture2D(注意设置正确的显存访问权限) - 调用
SoftwareBitmap.CopyToBufferAsync将像素数据复制到纹理的显存缓冲区 - 将这个纹理传入录制流程,替代原始的捕获帧Surface
内容的提问来源于stack exchange,提问作者oskar
相关产品推荐
相关产品推荐

