将纹理复制到纹理

Posted

技术标签:

【中文标题】将纹理复制到纹理【英文标题】:Copy Texture to Texture 【发布时间】:2011-03-16 00:35:31 【问题描述】:

我已经完成了 2 个使用共享资源的程序,在 SlimDX 和 DirectX10 上运行。一个程序将在 3D 网格上显示共享纹理。第二个程序将加载图像作为纹理。到目前为止,每次从新图像更新纹理时,我都需要传递共享处理。

现在,有没有一种方法可以初始化固定大小的共享纹理(Texture2D),然后每次加载新图像时,我需要做的就是将其加载为纹理,然后将其复制到现有纹理。这样共享句柄就不会改变,而且我可以节省一些传递共享句柄的开销。对于 DirectX9,我确实知道有一个函数可以做到这一点,“StretchRectangle”,但我在 DirectX10 中找不到那个或类似的东西。

只要我将其更新为共享纹理,中间格式可以是任何东西,甚至是表面。

谢谢

【问题讨论】:

【参考方案1】:

CopyResource() 或 CopySubresourceRegion() 怎么样?我不知道 SlimDX,但这些在原生 D3D10 中应该可以正常工作。

【讨论】:

CopyResource 不起作用。 CopySubresourceRegion 也不能正常工作,但我可能设置错了。你有任何工作代码吗?我只需要成功复制纹理的代码。我会处理共享句柄,谢谢 您能否更具体地了解“不起作用”?发生什么了?如果您在 CreateDevice 期间启用调试层,您是否会在调试输出中收到任何警告或错误?这些调用是从一种纹理复制到另一种纹理的主要方式,所以如果它们不起作用,我一定是误解了你原来的问题。 对错误信息深表歉意。它没有传递纹理。但我今天才意识到,实际上确实如此,只是我需要处理纹理,然后第一个程序将显示纹理。所以现在我决定使用 CopyResource()。但是必须在每次重新加载时重新创建纹理。是否是“锁定”导致第一个程序无法读取纹理? 不确定您所说的“锁定”是什么意思。共享表面很棘手:因为渲染命令(包括 Copy*())由 DX 排队,您​​需要以某种方式确保在从共享表面读取之前刷新队列并完成命令。处理纹理可能会隐含地做到这一点。在 C++ 中,您将使用 IDXGIKeyedMutex 接口来完成此操作,而无需破坏和重新创建源纹理;我不知道这在 SlimDX 中是否可用。

以上是关于将纹理复制到纹理的主要内容,如果未能解决你的问题,请参考以下文章

openGL FBO 复制到纹理导致黑色/深色图像

将 2D 纹理阵列的单层从 GPU 复制到 CPU

将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文

如何将部分纹理复制到opengl中的图像

Cuda - 从设备全局内存复制到纹理内存

使用 ShaderMaterial 复制 MeshLambertMaterial 会忽略纹理