【问题标题】:DirectX 11 How process an image from sharedHandle on the GPUDirectX 11 如何在 GPU 上处理来自 sharedHandle 的图像
【发布时间】: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


    【解决方案1】:

    通过首先调用 OpenSharedResource、CreateShaderResourceView、CopyResource、Map 然后使用 D3D11_MAPPED_SUBRESOURCE.pData 作为起始指针解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 2010-09-30
      • 1970-01-01
      • 2016-07-18
      • 2018-11-12
      • 1970-01-01
      • 2019-05-22
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多