使用Unity3D中的PInvoke将cv :: Mat上传到D3D纹理

时间:2016-02-26 16:27:49

标签: opencv unity3d directx directx-11

状况

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

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

  1. 从相机的传感器读出一张图像到cv :: Mat;
  2. 将cv :: Mat复制到非托管缓冲区(Unity3D非托管内存中的缓冲区);
  3. 非托管缓冲区被封送到托管缓冲区中;
  4. 通过调用LoadRawTextureData(byte [] managedBuffer)将托管缓冲区加载(复制)到Texture2D内部缓冲区中;
  5. 通过调用Apply。将Texture2D内部缓冲区上传到GPU。
  6. 我在写这个问题的时候注意到,Texture2D有另一种形式(自从我编写了我认为的DLL之后的新形式),用于从非托管缓冲区加载其内部缓冲区:http://docs.unity3d.com/ScriptReference/Texture2D.LoadRawTextureData.html

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

    问题

    我想尽可能从管道中撤出CPU。 我想将cv :: Mat直接上传到GPU中的Texture2D。

    有一种Texture2D方法可以在GPU上获取原生纹理指针:http://docs.unity3d.com/ScriptReference/Texture.GetNativeTexturePtr.html

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

0 个答案:

没有答案