在 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 表面缓冲区上执行转置操作的主要内容,如果未能解决你的问题,请参考以下文章
了解 DXGI DirectX 11 桌面复制以获取缓冲区或数组的问题
对于 DirectX 11,我不能在每个渲染()中计算缓冲区吗?