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(); }
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]; }
// 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(); }
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); }