Winapi 将IDirect3DSurface的数据复制到使用两个directx设备创建的另一个IDirect3DSurface

Winapi 将IDirect3DSurface的数据复制到使用两个directx设备创建的另一个IDirect3DSurface,winapi,directx,direct3d,directx-9,direct3d9,Winapi,Directx,Direct3d,Directx 9,Direct3d9,有一个带有自己的Direct3D设备的窗口,我们称之为mainWindow。mainWindow和它的东西是由其他人创建的。他们给了我一些Direct3D曲面(IDirect3DSurface9指针),他们正在主窗口上绘制这些曲面。 我从他们的一个回调中启动了一个线程,并使用winAPI创建了自己的窗口。 (我有一个类似的问题) 我想在我的窗口上绘制那些RTT输出。因此,我尝试将曲面复制到我在自己的directx设备中创建的曲面/纹理中,该设备在我的窗口上绘制。 我在做这件事的时候发现了一些东西

有一个带有自己的Direct3D设备的窗口,我们称之为mainWindow。mainWindow和它的东西是由其他人创建的。他们给了我一些Direct3D曲面(IDirect3DSurface9指针),他们正在主窗口上绘制这些曲面。
我从他们的一个回调中启动了一个线程,并使用winAPI创建了自己的窗口。 (我有一个类似的问题)
我想在我的窗口上绘制那些RTT输出。因此,我尝试将曲面复制到我在自己的directx设备中创建的曲面/纹理中,该设备在我的窗口上绘制。

我在做这件事的时候发现了一些东西

  • 使用
    D3DXSaveSurfaceToFileInMemory(…)
    D3DXCreateTextureFromFileInMemory(…)
    函数可以轻松完成此操作
  • StrechRect(…)
    函数不适用于使用两个设备创建的两个曲面
我试着锁定曲面并将数据从一个曲面复制到另一个曲面,但似乎不起作用。但我会再试一次。(同时从两个不同设备锁定表面是否违法?)

你们有什么方法知道或建议这样做吗

---编辑---
MSDN说()

在Windows Vista中,CreateTexture可以从系统创建纹理 内存指针允许应用程序在使用时具有更大的灵活性, 分配和删除系统内存。例如,一个 应用程序可以传递GDI系统内存位图指针并获取 它周围的Direct3D纹理界面。使用系统内存指针 CreateTexture具有以下限制

  • 纹理的间距必须等于宽度乘以每个像素的字节数
  • 仅支持具有单个mipmap级别的纹理。Levels参数必须为1
  • Pool参数必须是D3DPOOL\u SYSTEMMEM
  • pSharedHandle参数必须是指向可容纳系统内存点的缓冲区的有效指针*pSharedHandle必须是有效的 指向系统内存的指针,其大小(以字节为单位)为纹理宽度* 纹理高度*纹理格式的每像素字节数
我找不到任何用这种方法创建纹理的例子,但我试着去做,我得到的只是一个充满噪音的输出,其他什么都没有。如果有人能在这方面帮助我,我想我的问题会在某种程度上得到解决。。。。
msdn在这里所说的有什么好的例子吗?

如果你在vista/win7/win8中,你可以使用它,那么你不需要任何副本。

你的两个曲面是创建两个进程还是一个进程?单进程,我通过回调启动了自己的线程,这样当用户发送特定命令打开它时,我的线程就会启动并显示窗口。我尝试锁定纹理表面(0级)和其他表面,并复制数据。好吧,那奏效了。但是我想知道
CreateTexture
有多好。根据MSDN页面,我必须传递一个
void*
,它指向像素数据作为
CreateTexture
函数的最后一个参数,rite?例如:
void*\u pt;CreateTexture(宽度、高度、1、D3dAge\u动态、格式、D3DPOOL\u SYSTEMMEM和mytexture(句柄*)\u pt)