【发布时间】:2021-03-03 22:38:30
【问题描述】:
我有一个存在于 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 都比较陌生,所以非常感谢任何帮助!
【问题讨论】:
标签: c++ shader directx-11