void DispatchShaders() { traversalShader.SetFloat("radius", diameter / 2); traversalShader.SetFloat("speed", speed); traversalShader.SetFloat("gravity", gravityMul); traversalShader.SetVector("gravityVec", gravityVec); traversalShader.SetFloat("angularSpeed", angularSpeed); traversalShader.SetFloat("viscosity", viscosity); traversalShader.SetFloat("DeltaTime", simulationTimeStep); if (sphereCollider != null) { traversalShader.SetVector("sphereColliderPos", sphereCollider.transform.position); traversalShader.SetFloat("sphereRadius", sphereCollider.transform.lossyScale.y / 2); } sortShader.Dispatch(sortingKernelHandler, count / sortMergeGroupSize, 1, 1); mergeShader.Dispatch(mergeKernelHandler, count / sortMergeGroupSize, 1, 1); traversalShader.Dispatch(writeNodeDataKernelHandler, count / groupSize, 1, 1); bvhShader.Dispatch(treeConstructionKernelhandler, count / groupSize, 1, 1); AABBShader.Dispatch(boundingSphereKernelHandler, count / groupSize, 1, 1); //Cpu AABB implementation here //boundingInternalNodeBuffer.GetData(nodeData); //boundingLeafNodeBuffer.GetData(leafData); //CreateBoundingBoxes(ref nodeData,ref leafData); //boundingInternalNodeBuffer.SetData(nodeData); traversalShader.Dispatch(traversalKernelKernelHandler, count / mainKernelGroupSize, 1, 1); traversalShader.Dispatch(mainKernelHandler, count / mainKernelGroupSize, 1, 1); }
// Use this for initialization void Start() { PhysicsDebugger.GizmoPosScale = GizmoPosScale; PhysicsDebugger.GizmoScale = GizmoScale; //Initialize variables traversalShader.SetFloat("radius", diameter / 2); traversalShader.SetFloat("speed", speed); traversalShader.SetFloat("gravity", gravityMul); traversalShader.SetVector("gravityVec", gravityVec); traversalShader.SetFloat("angularSpeed", angularSpeed); traversalShader.SetFloat("DeltaTime", Time.deltaTime / integrationStep); //Setup buffers int particleStructSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(particle)); int nodeStructSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(internalNode)); leafNodeBuffer = new ComputeBuffer(count, nodeStructSize, ComputeBufferType.Default); boundingLeafNodeBuffer = new ComputeBuffer(count, nodeStructSize, ComputeBufferType.Default); internalNodeBuffer = new ComputeBuffer(count - 1, nodeStructSize, ComputeBufferType.Default); boundingInternalNodeBuffer = new ComputeBuffer(count - 1, nodeStructSize, ComputeBufferType.Default); inputcomputeBuffer = new ComputeBuffer(count, particleStructSize, ComputeBufferType.Default); mergeOutputBuffer = new ComputeBuffer(count, particleStructSize, ComputeBufferType.Default); argsBuffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments); AABBParentIdsBuffer = new ComputeBuffer(count, sizeof(int), ComputeBufferType.Default); //Apply buffer for instanced mesh drawing instanceMaterial.SetBuffer("positionBuffer", inputcomputeBuffer); uint numIndices = (particleMesh != null) ? (uint)particleMesh.GetIndexCount(0) : 0; args[0] = numIndices; args[1] = (uint)count; argsBuffer.SetData(args); cachedInstanceCount = count; //Generate Initial Particle Values particle[] points = PUtility.GetParticlePoints(count, size, diameter / 2, mass); inputcomputeBuffer.SetData(points); //Apply //Get kernels mainKernelHandler = traversalShader.FindKernel("CSMain"); mortonKernelHandler = traversalShader.FindKernel("CSAssignMortonIDs"); treeConstructionKernelhandler = bvhShader.FindKernel("CSCreateBVH"); boundingSphereKernelHandler = AABBShader.FindKernel("CSGenerateBoundingBoxes"); mergeKernelHandler = mergeShader.FindKernel("Merge"); sortingKernelHandler = sortShader.FindKernel("RadixSort"); writeNodeDataKernelHandler = traversalShader.FindKernel("WriteNodeData"); traversalKernelKernelHandler = traversalShader.FindKernel("TraversalKernel"); unionKerneHandler = AABBShader.FindKernel("CSUnion"); //Create MortonIDs traversalShader.SetBuffer(mortonKernelHandler, "inputPoints", inputcomputeBuffer); traversalShader.Dispatch(mortonKernelHandler, count / groupSize, 1, 1); Debug.Log("Dispatched morton kernel"); //Sort & Merge IDs sortShader.SetBuffer(sortingKernelHandler, "Data", inputcomputeBuffer); mergeShader.SetBuffer(mergeKernelHandler, "inputPoints", inputcomputeBuffer); mergeShader.SetBuffer(mergeKernelHandler, "mergeOutputBuffer", mergeOutputBuffer); traversalShader.SetBuffer(writeNodeDataKernelHandler, "internalNodes", internalNodeBuffer); traversalShader.SetBuffer(writeNodeDataKernelHandler, "leafNodes", leafNodeBuffer); traversalShader.SetBuffer(writeNodeDataKernelHandler, "boundingInternalNodes", boundingInternalNodeBuffer); traversalShader.SetBuffer(writeNodeDataKernelHandler, "boundingLeafNodes", boundingLeafNodeBuffer); traversalShader.SetBuffer(writeNodeDataKernelHandler, "mergeOutputBuffer", mergeOutputBuffer); //Create Tree bvhShader.SetBuffer(treeConstructionKernelhandler, "inputPoints", inputcomputeBuffer); bvhShader.SetBuffer(treeConstructionKernelhandler, "internalNodes", internalNodeBuffer); bvhShader.SetBuffer(treeConstructionKernelhandler, "leafNodes", leafNodeBuffer); bvhShader.SetBuffer(treeConstructionKernelhandler, "boundingInternalNodes", boundingInternalNodeBuffer); bvhShader.SetBuffer(treeConstructionKernelhandler, "boundingLeafNodes", boundingLeafNodeBuffer); bvhShader.SetBuffer(treeConstructionKernelhandler, "mergeOutputBuffer", mergeOutputBuffer); bvhShader.SetBuffer(treeConstructionKernelhandler, "parentIds", AABBParentIdsBuffer); Debug.Log("Dispatched tree contruction kernel"); //Create bounding sphere AABBShader.SetBuffer(boundingSphereKernelHandler, "internalNodes", internalNodeBuffer); AABBShader.SetBuffer(boundingSphereKernelHandler, "mergeOutputBuffer", mergeOutputBuffer); AABBShader.SetBuffer(boundingSphereKernelHandler, "boundingInternalNodes", boundingInternalNodeBuffer); AABBShader.SetBuffer(boundingSphereKernelHandler, "boundingLeafNodes", boundingLeafNodeBuffer); AABBShader.SetBuffer(boundingSphereKernelHandler, "parentIds", AABBParentIdsBuffer); AABBShader.SetBuffer(unionKerneHandler, "boundingLeafNodes", boundingLeafNodeBuffer); AABBShader.SetBuffer(unionKerneHandler, "boundingInternalNodes", boundingInternalNodeBuffer); AABBShader.SetBuffer(unionKerneHandler, "parentIds", AABBParentIdsBuffer); traversalShader.SetBuffer(traversalKernelKernelHandler, "boundingLeafNodes", boundingLeafNodeBuffer); traversalShader.SetBuffer(traversalKernelKernelHandler, "boundingInternalNodes", boundingInternalNodeBuffer); traversalShader.SetBuffer(traversalKernelKernelHandler, "mergeOutputBuffer", mergeOutputBuffer); //Apply Movement traversalShader.SetBuffer(mainKernelHandler, "boundingInternalNodes", boundingInternalNodeBuffer); traversalShader.SetBuffer(mainKernelHandler, "boundingLeafNodes", boundingLeafNodeBuffer); traversalShader.SetBuffer(mainKernelHandler, "mergeOutputBuffer", mergeOutputBuffer); traversalShader.SetBuffer(mainKernelHandler, "inputPoints", inputcomputeBuffer); //CommandBuffer cm = new CommandBuffer(); //CommandBuffer cm2 = new CommandBuffer(); //CommandBuffer cm3 = new CommandBuffer(); //CommandBuffer cm4 = new CommandBuffer(); // // //cm.DispatchCompute(sortShader, sortingKernelHandler, count / groupSize, 1, 1); //cm.DispatchCompute(mergeShader, mergeKernelHandler, count / groupSize, 1, 1); //cm2.DispatchCompute(traversalShader, writeNodeDataKernelHandler, count / groupSize, 1, 1); //cm2.DispatchCompute(bvhShader, treeConstructionKernelhandler, count / groupSize, 1, 1); //cm2.DispatchCompute(AABBShader, boundingSphereKernelHandler, count / groupSize, 1, 1); //cm4.DispatchCompute(traversalShader, traversalKernelKernelHandler, count / groupSize, 1, 1); //cm4.DispatchCompute(traversalShader, mainKernelHandler, count / groupSize, 1, 1); // //Camera.main.AddCommandBuffer(CameraEvent.BeforeSkybox, cm); //Camera.main.AddCommandBuffer(CameraEvent.BeforeSkybox, cm2); //Camera.main.AddCommandBuffer(CameraEvent.AfterSkybox, cm4); //Camera.main.AddCommandBuffer(CameraEvent.AfterSkybox, cm4); }