微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调度超过65535个线程

如何解决调度超过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上的某人似乎存在性能问题,因此在我看来,您必须减少该大数。 我不确定,但是我感觉到您在误解这些参数。尝试再次阅读这些值的实际含义。 (不过,只是外行的直觉。)     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。