开发者

Dispatching more than 65535 threads

开发者 https://www.devze.com 2023-03-14 06:09 出处:网络
I\'m attempting to skin vertices using DirectCompute. The method of skinning employed is such that you can have a variable amount of weights influencing each vertex (e.g. Md5 meshes are defined this w

I'm attempting to skin vertices using DirectCompute. The method of skinning employed is such that you can have a variable amount of weights influencing each vertex (e.g. Md5 meshes are defined this way).

Basically inputs to the compute shader are.

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

and the output is

SkinnedVerticesBuffer { float3 normal, float4 position, float2 texcoord } Structured buffer UAV

Now the compute shader should be run once per element in the vertex buffer, and using SV_DispatchThreadID the shader attempts to populate the corresponding SkinnedVertex in the SkinnedVerticesBuffer for every Vertex in the VerticesBuffer ( 1:1 correspondence ).

So the problem is that many meshes have greater than 65535 vertices, and the DispatchThreadID command only allows for dispatching that many threads per dimension. Now I can theoretically write something that div开发者_运维百科ides a lot of numbers up into a combination of three factors less than 65535, but I can't possibly do that for prime numbers.

So for example when some mesh with 71993 ( a prime number ) of vertices comes up I can't think of a way to handle it.

I can't over dispatch say 72000 threads with context->Dispatch( 36000, 2, 0 ), because then DispatchThreadID will run out of my buffer bounds.

Right now I'm leaning towards a constant buffer holding the amount of vertices, and then over dispatching to the nearest power of 2 and then simply doing

if( SV_DispatchThreadID > numVertices ) return;

Is this my only option? Anyone else run into this snag.


I've never. But 65000 threads seems like an awful lot.

Then, when I try to find documentation it seems that the values you pass are not threads, but thread groups. Someone on gamedev seems to have performance issues when passing a number as great as 768, so it seems to me that you will have to decrease that huge number.

I'm not sure, but I got the feeling you're misinterpreting these parameters. Try to read again what these values actually mean. (Just a layman's gut feeling, though.)

0

精彩评论

暂无评论...
验证码 换一张
取 消