Пример #1
0
    void OnRenderObject()
    {
        ///
        // Render Frame
        // Get arg buffer for triangles
        // Instantiate active particles for rendering
        computeShader.SetBuffer(KInstantiate, "triAppendBuffer", agentInstanceBuffer);
        computeShader.SetBuffer(KInstantiate, "agentBufferIn", agentBufferIn);
        computeShader.Dispatch(KInstantiate, maxAgents / BLOCK_SIZE, 1, 1);
        ComputeBuffer.CopyCount(agentInstanceBuffer, agentCountArgBuffer, 0);
        // Set uniforms
        triMaterial.SetPass(0);
        triMaterial.SetColor("col", triColor);
        triMaterial.SetFloat("unitScale", unitScale);
        // Set Renderer Buffers
        triMaterial.SetBuffer("agentBuffer", agentBufferIn);
        triMaterial.SetBuffer("triBuffer", agentInstanceBuffer);

        // Draw Verts
        Graphics.DrawProceduralIndirect(MeshTopology.Points, agentCountArgBuffer, 0);

        // Clear Instance Buffer
        agentInstanceBuffer.ClearAppendBuffer();

        // Clear returned agents
        returnBuffer.ClearAppendBuffer();
    }
Пример #2
0
    void Update()
    {
        // Flip Buffers
        agentBufferIn  = isEvenInBuffer ? agentBuffer0 : agentBuffer1;
        agentBufferOut = isEvenInBuffer ? agentBuffer1 : agentBuffer0;
        isEvenInBuffer = !isEvenInBuffer;

        ///
        // Dispatch Compute Shaders
        // Set Compute Shader Buffers and uniforms for Main
        agentComputeShader.SetFloat("maxAccel", maxAccel);
        Vector3 groundedTarget = player.transform.position;

        groundedTarget.y = 0.0f;

        agentComputeShader.SetVector("targetPos", groundedTarget);
        agentComputeShader.SetBuffer(KMain, "agentBufferIn", agentBufferIn);
        agentComputeShader.SetBuffer(KMain, "agentBufferOut", agentBufferOut);
        agentComputeShader.SetBuffer(KMain, "damageBuffer", damageBuffer);
        agentComputeShader.SetBuffer(KMain, "appendFreeBuffer", freeBuffer);
        // Dispatch Main Kernel
        agentComputeShader.Dispatch(KMain, maxAgents / BLOCK_SIZE, 1, 1);



        // Set Compute Shader Buffers and uniforms for Spawn
        spawnBuffer.SetData(spawningAgents.ToArray());
        agentComputeShader.SetInt("agentsToSpawn", spawningAgents.Count);
        agentComputeShader.SetBuffer(KSpawn, "spawnBuffer", spawnBuffer);
        agentComputeShader.SetBuffer(KSpawn, "consumeFreeBuffer", freeBuffer);
        agentComputeShader.SetBuffer(KSpawn, "agentBufferOut", agentBufferOut);

        // Dispatch Spawn Kernel
        agentComputeShader.Dispatch(KSpawn, spawnerBlockCount, 1, 1);
        spawningAgents.Clear();


        // Update agent count
        ComputeBuffer.CopyCount(freeBuffer, agentCountArgBuffer, 4);
        SetCommandBuffer();


        // Instantiate active particles for rendering
        agentInstanceBuffer.ClearAppendBuffer();
        agentComputeShader.SetBuffer(KInstantiate, "instanceAppendBuffer", agentInstanceBuffer);
        agentComputeShader.SetBuffer(KInstantiate, "agentBufferIn", agentBufferIn);
        agentComputeShader.Dispatch(KInstantiate, maxAgents / BLOCK_SIZE, 1, 1);

        /// Attach Buffers to material
        instanceMaterial.SetBuffer("_AgentData", agentBufferIn);
        instanceMaterial.SetBuffer("_AgentIndirectBuffer", agentInstanceBuffer);
        instanceMaterial.SetBuffer("_Indices", characterData.indexBuffer);
        instanceMaterial.SetBuffer("_UV", characterData.uvBuffer);
        instanceMaterial.SetBuffer("_VertexData", characterData.vertexBuffer);
        instanceMaterial.SetBuffer("_NormalsData", characterData.normalBuffer);

        agentCountArgBuffer.GetData(agentCountArgs);
        agentCount = maxAgents - agentCountArgs[1];
    }
Пример #3
0
    // Use this for initialization
    void Start()
    {
        // get player gameobject
        player = GameObject.Find("FPSController");

        // init character data
        characterData.initBuffers();


        // Create Kernels and Material
        KMain        = agentComputeShader.FindKernel("Main");
        KInit        = agentComputeShader.FindKernel("Init");
        KSpawn       = agentComputeShader.FindKernel("Spawn");
        KInstantiate = agentComputeShader.FindKernel("Instantiate");
        KDealDamage  = agentComputeShader.FindKernel("DealDamage");


        ///
        // Create Buffers
        // Agent Buffers
        agentBuffer0 = new ComputeBuffer(maxAgents, AgentData.size);
        agentBuffer1 = new ComputeBuffer(maxAgents, AgentData.size);

        // Spawn Buffer
        spawnBuffer    = new ComputeBuffer(BLOCK_SIZE * spawnerBlockCount, AgentData.size);
        spawningAgents = new List <AgentData>(BLOCK_SIZE * spawnerBlockCount);

        // Free Buffer
        freeBuffer = new ComputeBuffer(maxAgents, sizeof(int), ComputeBufferType.Append);
        freeBuffer.ClearAppendBuffer();

        // Instance Buffer
        agentInstanceBuffer = new ComputeBuffer(maxAgents, sizeof(int), ComputeBufferType.Append);
        agentInstanceBuffer.ClearAppendBuffer();

        // Damage Buffer
        damageBuffer = new ComputeBuffer(maxAgents, sizeof(float));

        // Args Buffer
        agentCountArgBuffer = new ComputeBuffer(4, sizeof(int), ComputeBufferType.IndirectArguments);
        agentCountArgs      = new int[] { characterData.indexBuffer.count, 0, 0, 0 };
        agentCountArgBuffer.SetData(agentCountArgs);



        // Run init shader on initial buffer
        agentComputeShader.SetBuffer(KInit, "appendFreeBuffer", freeBuffer);
        agentComputeShader.SetBuffer(KInit, "agentBufferOut", agentBuffer0);
        agentComputeShader.SetBuffer(KInit, "damageBuffer", damageBuffer);
        agentComputeShader.Dispatch(KInit, maxAgents / BLOCK_SIZE, 1, 1);


        // Init constant uniforms
        agentComputeShader.SetInt("maxAgents", maxAgents);

        SetCommandBuffer();
    }
Пример #4
0
    void Start()
    {
        // Grab phosphor manager
        phosphorManager = FindObjectOfType <PhosphorManager>();
        // Grab chat
        chat = FindObjectOfType <Chat>();

        // Create Kernels and Material
        KernelMain    = computeShader.FindKernel("KMain");
        KInit         = computeShader.FindKernel("KInit");
        KSpawn        = computeShader.FindKernel("KSpawn");
        KInstantiate  = computeShader.FindKernel("KInstantiate");
        KPhosphorFeed = computeShader.FindKernel("KPhosphorFeed");
        KReturn       = computeShader.FindKernel("KReturn");

        triMaterial = new Material(triShader);

        ///
        // Create Buffers
        // Agent Buffers
        agentBuffer0 = new ComputeBuffer(maxAgents, AgentData.size);
        agentBuffer1 = new ComputeBuffer(maxAgents, AgentData.size);

        // Spawn Buffer
        spawnBuffer    = new ComputeBuffer(BLOCK_SIZE * spawnerBlockCount, AgentData.size);
        spawningAgents = new List <AgentData>(BLOCK_SIZE * spawnerBlockCount);

        // Free Buffer
        freeBuffer = new ComputeBuffer(maxAgents, sizeof(int), ComputeBufferType.Append);
        freeBuffer.ClearAppendBuffer();

        // Triangle Instance Buffer
        agentInstanceBuffer = new ComputeBuffer(maxAgents, sizeof(int), ComputeBufferType.Append);
        agentInstanceBuffer.ClearAppendBuffer();

        // Args Buffer
        agentCountArgBuffer = new ComputeBuffer(4, sizeof(int), ComputeBufferType.DrawIndirect);
        int[] dArgs = new int[] { 0, 1, 0, 0 };
        agentCountArgBuffer.SetData(dArgs);

        // Targets Buffer
        targetsBuffer = new ComputeBuffer(phosphorManager.phosphorsToSpawn + 1, sizeof(float) * 4);
        targetsArray  = new Vector4[phosphorManager.phosphorsToSpawn + 1];
        // Set home target end of array to zero
        targetsArray[phosphorManager.phosphorsToSpawn] = Vector4.zero;

        // Return Buffer... awful way to do this?
        returnBuffer = new ComputeBuffer(maxAgents, sizeof(int), ComputeBufferType.Append);
        returnIds    = new int[maxAgents];
        returnBuffer.ClearAppendBuffer();


        // Run init shader on initial buffer
        computeShader.SetBuffer(KInit, "appendFreeBuffer", freeBuffer);
        computeShader.SetBuffer(KInit, "agentBufferOut", agentBuffer0);
        computeShader.Dispatch(KInit, maxAgents / BLOCK_SIZE, 1, 1);


        // Init constant uniforms
        computeShader.SetInt("maxAgents", maxAgents);
        computeShader.SetInt("maxPhosphors", phosphorManager.phosphorsToSpawn);
    }