示例#1
0
    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);
    }
示例#2
0
    // 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);
    }