调度超过65535个线程

问题描述

| 我正在尝试使用DirectCompute对顶点进行蒙皮。所使用的蒙皮方法是这样,您可以影响每个顶点的权重可变(例如,以这种方式定义Md5网格)。 基本上是计算着色器的输入。
JointsBuffer { float4 orientation,float4 position } Structured buffer SRV
WeightsBuffer { float3 normal,float4 position,float bias,uint jointIndex } Structured buffer SRV
VerticesBuffer { float2 texcoords,uint weightIndex,uint numWeights } Structured buffer SRV
输出
SkinnedVerticesBuffer { float3 normal,float2 texcoord } Structured buffer UAV
现在,计算着色器应该在顶点缓冲区中的每个元素上运行一次,并且使用SV_dispatchThreadID,着色器会尝试在SkinnedVerticesBuffer中为VerticesBuffer中的每个顶点填充对应的SkinnedVertex(1:1对应)。 因此,问题在于许多网格具有大于65535个顶点,而dispatchThreadID命令仅允许每个维度分派那么多线程。现在,我可以从理论上写出一些东西,将许多数字分成三个因子,少于65535,但是我不可能对质数进行此操作。 因此,例如当出现带有71993(素数)个顶点的网格时,我想不出一种方法来处理它。 我不能用context-> dispatch(36000,2,0)来调度72000个线程,因为这样dispatchThreadID会超出我的缓冲区范围。 现在,我倾向于保留一个顶点数量的恒定缓冲区,然后过度调度到2的幂次,然后简单地执行
if( SV_dispatchThreadID > numVertices ) return;
这是我唯一的选择吗?其他任何人都会遇到这种障碍。     

解决方法

        我从来没有但是65000个线程似乎很多。 然后,当我尝试查找文档时,似乎您传递的值不是线程,而是线程组。当通过高达768的数字时,gamedev上的某人似乎存在性能问题,因此在我看来,您必须减少该大数。 我不确定,但是我感觉到您在误解这些参数。尝试再次阅读这些值的实际含义。 (不过,只是外行的直觉。)