计算纹理中的元素

Count elements in texture

我有一个用零初始化的 32 位无符号整数的 3D 纹理。定义如下:

D3D11_TEXTURE3D_DESC description{};
description.Format = DXGI_FORMAT_R32_UINT;
description.Usage = D3D11_USAGE_DEFAULT;
description.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
description.CpuAccessFlags = 0;
description.MipLevels = 1;
description.Width = ...;
description.Height = ...;
description.Depth = ...;

我正在计算着色器中写入此纹理,以便在满足特定条件时在指定位置设置位:

RWTexture3D<uint> txOutput : register(u0)

cbuffer InputBuffer : register(b0)
{
    uint position;
    /** other elements **/
}

#define SET_BIT(value, position) value |= (1U << position)

[numthreads(8, 8, 8)]
void main(uint3 threadID : SV_DispatchThreadID)
{
    if(/** some condition **/)
    {
        uint value = txOutput[threadID];
        SET_BIT(value, position);
        txOutput[threadID] = value;
    }
}

我需要知道在C++代码隐藏的某个位位置填充了这个纹理的多少个元素。这怎么可能?

您必须使用 ID3D11DeviceContext::Map API 将纹理读回 cpu https://docs.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-map

您将得到一个 void*,您将转换为 uint32_t*,这将指向您的数据的开始。

您需要更好地查找 DirectX 文档,它确实是非常好的文档。如果你继续做 3D 图形,你需要在文档中找到很多更难的东西。

当我需要回读到 cpu 时,我总是在 cpu 上累积,因为在 gpu 上累积很困难,而且只能部分并行。

在 gpu 上对纹理求和称为并行缩减,这种类型的编程称为通用 gpu (gpgpu)。用于直接计算的 gpgpu 上最优秀的资源是这些来自 nvidia 的幻灯片,它们通过优化并行缩减 https://on-demand.gputechconf.com/gtc/2010/presentations/S12312-DirectCompute-Pre-Conference-Tutorial.pdf

来自幻灯片:

for (unsigned int s=groupDim_x/2; s>0; s>>=1)
{
    if (tid < s)
    {
        sdata[tid] += sdata[tid + s];
    }
    GroupMemoryBarrierWithGroupSync();
}