I am attempting to maneuver a 262,144 [2^18] factors (stars) in a compute shader and am struggling to reliably handle the info in a buffer.
I perceive that there is a third-dimensional array SV_DispatchThreadID
that gives an index for the thread within the thread group.
My {hardware} can run 65,536 threads per thread group (assuming I’ve understood the terminology accurately). As my whole variety of stars exceeds that quantity (they usually’re rendered), unity have to be making a number of calls beneath the covers(?)
In any case, I’ve:
[numthreads(64, 64, 16)]
void BuildStars(uint3 id3 : SV_DispatchThreadID, uint id1 : SV_GroupIndex) {
int id = id3.x
+ id3.y * 64
+ id3.z * 4096;
...
[To simplify things, I’m only attempting to use 32,768 stars to begin with, meaning I’m ignoring id1
for the moment. I’d hoped to be able to add id += id1 * 65536
, but I haven’t got that far yet]
The motion of the celebrities is inconsistent. Some transfer much more quickly than others, some do not transfer in any respect.
As all I am doing is including a continuing offset each body, the one rationalization I can give you is that I am producing the ID incorrectly, wrapping round and successfully updating random stars
mapComputeShader.Dispatch(Kernel("MoveStars"), 64, 64, 8);
With an eye fixed to calling the next in future
mapComputeShader.Dispatch(Kernel("MoveStars"), 64, 64, 64);
What is the appropriate means from throughout the compute shader to get an id that varies from 0
to numDispatchedThreads - 1
, the place numDispatchedThreads
exceeds 65,536?