HLSL(计算着色器)中的奇数线程程序

多斯先生

我正在使用 Unity 在 GPU 上启动 HLSL 内核。我正在使用的函数是,ComputeShader.Dispatch但如果您不熟悉 Unity,则该函数仅在 GPU 上调度着色器,并将所需线程组的大小 x、y 和 z 作为参数。

这是我的问题,我有时想多次运行这个内核。

我可以Dispatch用一个奇怪的大小调用,但这样做意味着像这样定义我的内核,[numthreads(1,1,1)]这是众所周知的低效。

您如何管理线程以处理奇怪的纹理或其他不规则形状?

非常感谢

猫猫

执行此任务的标准方法是确保您不会执行越界读/写。

所以假设你的组数是

[numthreads(8,8,1)]

在任何情况下,即使您的纹理大小不是奇数,也不是 8 的倍数(在每个维度上),您也可能会发生这种情况。

假设现在您要处理 18*9 的纹理

您需要在每个维度上调度足够的线程以至少覆盖整个纹理:

X = 18 / 8 (2.25),所以你需要 3 组(将处理 24 个像素) Y = 9 / 8 (1.125),你需要 2 组

所以你会调用 dispatch 作为 context.Dispatch(3,2,1)

在计算着色器中,执行此操作的标准方法是在超出范围的情况下提前返回。

Texture2D texture2d <string uiname="Texture";>;

uint Width;
uint Height;

[numthreads(8,8,1)]
void CS(uint3 tid : SV_DispatchThreadID)
{
    if (tid.x >= Width || tid.y >= Height)
        return;

    //Perform your processing
}

您需要将纹理大小发送到宽度/高度参数中,着色器不会以这种方式处理纹理之外的任何内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章