将纹理复制到纹理
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 中是否可用。以上是关于将纹理复制到纹理的主要内容,如果未能解决你的问题,请参考以下文章