我有一个存在于图形处理器上的纹理,我有一个到那个纹理的sharedHandle,我想在那个图片上做一些图像处理。我想得到一个特定颜色的像素的纹理坐标。
例如,我希望颜色为r135,g80,b175的所有像素的色调变化为40 (因此,70和90的绿色是可以接受的,但不能低于40或高于120,依此类推)
问题是我想通过着色器在GPU上做这件事,但我不知道怎么做。
我有一个工作版本,通过复制纹理到ram,然后从基本地址读取。问题是它太慢了。仅将纹理从gpu复制到ram就需要超过20ms。我希望这是最大的5ms总数,这就是为什么我只想发送整个图片的像素的坐标到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都是新手,所以如果有任何帮助,我将不胜感激!
发布于 2021-03-03 22:38:30
通过首先调用OpenSharedResource、CreateShaderResourceView、CopyResource、Map,然后使用D3D11_MAPPED_SUBRESOURCE.pData作为起始指针,解决了这个问题。
https://stackoverflow.com/questions/62237854
复制相似问题