在 DirectX 表面缓冲区上执行转置操作

Posted

技术标签:

【中文标题】在 DirectX 表面缓冲区上执行转置操作【英文标题】:Performing a transpose operation on a DirectX Surface Buffer 【发布时间】:2018-09-25 17:02:08 【问题描述】:

我正在使用启用了硬件加速的 IMFSourceReader 来解码视频并将它们读入我的应用程序。在调用 ReadSample 之后,我从 IMFSample 中获取了 IDirect3DSurface9。此时,我使用 LockRect() 调用来访问原始字节并将它们复制到我的应用程序缓冲区中。

我想在 GPU 上执行其他操作,例如转置以及可能将图像数据从行优先顺序转换为列优先顺序。

我可以为此设置 Blt 操作吗?

我遇到了 ID3DXBaseEffect 界面,但我不确定它是否适用于我的情况。

不胜感激。

饭菜

【问题讨论】:

【参考方案1】:

通过 IDirect3DSurface9,您可以使用着色器 (ID3DXBaseEffect)。

要直接在 GPU 上执行此操作,在将原始字节复制到您的应用程序之前,我会试试这个:

调用 IMFSourceReader::GetServiceForStream 查询 MR_VIDEO_ACCELERATION_SERVICE 和 IDirect3DDeviceManager9。 使用 IDirect3DDeviceManager9 查询 IDirect3DDevice9 (IDirect3DDeviceManager9::LockDevice)。 像往常一样使用 Directx 使用 IDirect3DDevice9、IDirect3DSurface9、新的 RenderTarget、着色器。 从最终的 RenderTarget 复制原始字节(应用着色器后)。

编辑

请看这里:mofo7777 github

在 MediaFoundationTransform > MFTDirectxAware > MFTVideoShaderEffect 下,我将展示这个概念。

【讨论】:

以上是关于在 DirectX 表面缓冲区上执行转置操作的主要内容,如果未能解决你的问题,请参考以下文章

从单独的线程在表单上绘制图像

Directx 11 前缓冲器

了解 DXGI DirectX 11 桌面复制以获取缓冲区或数组的问题

对于 DirectX 11,我不能在每个渲染()中计算缓冲区吗?

在 DirectX 11 中使用索引缓冲区;它是怎么知道的?

将 FBX 顶点和索引缓冲区导入 DirectX 11