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

DirectX 11 How process an image from sharedHandle on the GPU

我有一个存在于 GPU 上的纹理,我有一个该纹理的 sharedHandle 并且想对该图片进行一些图像处理。我想获得某种颜色像素的纹理坐标。

例如,我想要颜色为 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 作为起始指针解决了这个问题。