我正在尝试使用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, float4 position, float2 texcoord } Structured buffer UAV
现在计算着色器应该在顶点缓冲区中的每个元素运行一次,并且使用SV_DispatchThreadID,着色器尝试在VerticesBuffer(1:1对应关系)中的每个顶点填充SkinnedVerticesBuffer中的相应SkinnedVertex。
所以问题是许多网格有超过65535个顶点,而DispatchThreadID命令只允许每个维度调度那么多个网格。现在我理论上可以写出一些将大量数字分成小于65535的三个因子的组合,但我不可能对素数这样做。
因此,例如当一些具有71993(素数)顶点的网格出现时,我想不出处理它的方法。
我无法通过context-> Dispatch(36000,2,0)发出72000个线程,因为那时DispatchThreadID将用完我的缓冲区边界。
现在我倾向于保持顶点数量的恒定缓冲区,然后过度调度到最接近的2的幂,然后简单地执行
if( SV_DispatchThreadID > numVertices ) return;
这是我唯一的选择吗?其他任何人都遇到了这个障碍。
答案 0 :(得分:0)
我从来没有。但65000线程似乎非常多。
然后,当我尝试查找documentation时,您传递的值似乎不是线程,而是线程组。传递一个高达768的数字时,Someone on gamedev似乎存在性能问题,所以在我看来,你必须减少这个数字。
我不确定,但我觉得你错误地解释了这些参数。尝试再次阅读这些值实际意味着什么。 (不过,这只是一个外行人的直觉。)