情况

我有一台工业GigE相机 . GigE或USB或任何其他接口在这里无所谓 . 关键是摄像机不能被视为网络摄像头,因为它有自己的驱动程序 . 使用该相机SDK,我可以使用OpenCV将图像读出到cv :: Mat中,然后转换,不失真并在这些图像上执行其他处理 . 这很好用 .

然后,我想使用该相机在Unity3D(OS = Windows)中实时纹理四边形 . 我编写了一个DLL,它使用CPU将图像复制到Texture2D中,并使用Unity3D中的PInvoke调用该DLL . 管道是:

  • 一张图像从相机的传感器读出到cv :: Mat;

  • 将cv :: Mat复制到非托管缓冲区(Unity3D非托管内存中的缓冲区);

  • 非托管缓冲区被封送到托管缓冲区;

  • 通过调用LoadRawTextureData(byte [] managedBuffer)将托管缓冲区加载(复制)到Texture2D内部缓冲区中;

  • 通过调用Apply将Texture2D内部缓冲区上传到GPU .

在写这个问题的时候我注意到一个Texture2D有另一种形式(自从我编写了我认为的新文件以来用于从非托管缓冲区加载其内部缓冲区):http://docs.unity3d.com/ScriptReference/Texture2D.LoadRawTextureData.html

因此,可以删除步骤2和3,但仍需要在上传到GPU之前加载Texture2D内部缓冲区 .

问题

我想尽可能从管道中撤出CPU . I want to upload the cv::Mat directly into the Texture2D in GPU.

有这个Texture2D方法来获取GPU上的原生纹理指针:http://docs.unity3d.com/ScriptReference/Texture.GetNativeTexturePtr.html

我不知道如何处理它 . 我知道Direct3D中的一些基本内容(特别是D3D11),但我不是专家 . 任何人都可以解释有或没有代码如何将一些cv :: Mat复制到一些D3D11(或WindowsD的D3D12)纹理?