DirectX 11 如何处理来自 GPU 上的 sharedHandle 的图像

DirectX 11 How process an image from sharedHandle on the GPU

本文关键字:GPU 上的 sharedHandle 图像 何处理 处理 DirectX      更新时间:2023-10-16

我有一个存在于GPU上的纹理,我有一个该纹理的共享句柄,并希望对该图片进行一些图像处理。我想获取证书颜色像素的纹理绳索。

例如,我想要颜色 r135、g80、b175 的所有像素的阴影变化为 40(因此 70 和 90 的绿色是可以接受的,但不能低于 40 或高于 120 等(

问题是我想通过着色器在 GPU 上执行此操作,但我不知道该怎么做。

我有一个工作版本,它的工作原理是将纹理处理到 ram,然后从其基本地址读取。问题是它太慢了。仅处理从 GPU 到 ram 的纹理就需要 20 毫秒以上。我希望这总共最大为 5 毫秒,这就是为什么我只想将像素的坐标而不是整个图片发送到 ram。

这是我用来将纹理复制到 RAM 中的代码:

gs_texture_2d *_tex = (gs_texture_2d *)updateTex;
updateTex->device->device.Get()->CreateTexture2D(&(desc), NULL,
&currTexture);
updateTex->device->context.Get()->CopyResource(currTexture,
_tex->texture);
UINT subresource = D3D11CalcSubresource(0, 0, 0);
D3D11_MAPPED_SUBRESOURCE *pRes = new D3D11_MAPPED_SUBRESOURCE;
updateTex->device->context->Map(currTexture, subresource,
D3D11_MAP_READ_WRITE, 0, pRes);
void *baseadress = pRes->pData;

如何编写着色器来读取给定的像素tex_handle/sharedHandle,然后将该数据发送到 CPU?

我对 c++ 和 directX 都有点陌生,所以任何帮助将不胜感激!

首先调用OpenSharedResource,CreateShaderResourceView,CopyResource,Map,然后使用D3D11_MAPPED_SUBRESOURCE.pData作为起始指针来解决此问题。