计算纹理中的元素
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();
}
我有一个用零初始化的 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();
}