import FluidGridData; struct Params { // read-only FluidGridData velocityX; // read-only FluidGridData velocityY; // read-only FluidGridData velocityZ; // read-write FluidGridData divergence; // read-write FluidGridData pressure; }; ParameterBlock params; [shader("compute")] [numthreads(32, 8, 1)] void computeDivergence(uint3 dispatchThreadID: SV_DispatchThreadID) { FluidGridData velocityX = params.velocityX; FluidGridData velocityY = params.velocityY; FluidGridData velocityZ = params.velocityZ; FluidGridData divergence = params.divergence; FluidGridData pressure = params.pressure; int x = dispatchThreadID.x + 1; int y = dispatchThreadID.y + 1; int z = dispatchThreadID.z + 1; if (x >= gridParams.gridSize.x - 1 || y >= gridParams.gridSize.y - 1 || z >= gridParams.gridSize.z - 1) return; divergence[x, y, z] = -0.5f * (velocityX[x + 1, y, z] - velocityX[x - 1, y, z] + velocityY[x, y + 1, z] - velocityY[x, y - 1, z] + velocityZ[x, y, z + 1] - velocityZ[x, y, z - 1]); pressure[x, y, z] = 0; }