// For now only one seed data void InitializeNeuronCBufferData() { neuronInitDataCBuffer?.Release(); neuronInitDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 3); NeuronInitData[] neuronInitDataArray = new NeuronInitData[neurons.Count]; //[numNeurons]; for (int x = 0; x < neuronInitDataArray.Length; x++) { NeuronInitData neuronData = new NeuronInitData((float)neurons[x].io / 2.0f); neuronInitDataArray[x] = neuronData; } neuronInitDataCBuffer.SetData(neuronInitDataArray); }
private void InitializeComputeBuffers() { // first-time setup for compute buffers (assume new brain) if (tempNeuronList == null || tempAxonList == null) { CreateDummyBrain(); } // NEURON INIT DATA if (neuronInitDataCBuffer != null) { neuronInitDataCBuffer.Release(); } neuronInitDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 3); NeuronInitData[] neuronInitDataArray = new NeuronInitData[numNeurons]; // for now only one seed data for (int x = 0; x < neuronInitDataArray.Length; x++) { NeuronInitData neuronData = new NeuronInitData(); //neuronData.pos = Vector3.zero; // refBrain.neuronList[x].pos; neuronData.radius = 1.6f; neuronData.type = (float)tempNeuronList[x].neuronType / 2.0f; neuronData.age = UnityEngine.Random.Range(0f, 1f); // refBrain.neuronList[x].age; neuronInitDataArray[x] = neuronData; } neuronInitDataCBuffer.SetData(neuronInitDataArray); // NEURON FEED DATA if (neuronFeedDataCBuffer != null) { neuronFeedDataCBuffer.Release(); } neuronFeedDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 1); NeuronFeedData[] neuronValuesArray = new NeuronFeedData[numNeurons]; Debug.Log(neuronValuesArray.Length.ToString() + ", numNeurons: " + numNeurons.ToString()); for (int i = 0; i < neuronValuesArray.Length; i++) { neuronValuesArray[i].curValue = tempNeuronList[i].currentValue[0]; } neuronFeedDataCBuffer.SetData(neuronValuesArray); // NEURON SIM DATA if (neuronSimDataCBuffer != null) { neuronSimDataCBuffer.Release(); } neuronSimDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 3); // One-time initialization of positions:::: NeuronSimData[] neuronSimDataArray = new NeuronSimData[numNeurons]; for (int i = 0; i < neuronSimDataArray.Length; i++) { neuronSimDataArray[i].pos = UnityEngine.Random.onUnitSphere * 12f; //refBrain.neuronList[i].pos; if (tempNeuronList[i].neuronType == NeuronGenome.NeuronType.In) { neuronSimDataArray[i].pos.x = -6.0f * Mathf.Abs(neuronSimDataArray[i].pos.x); } else { neuronSimDataArray[i].pos.x = 6.0f * Mathf.Abs(neuronSimDataArray[i].pos.x); } } neuronSimDataCBuffer.SetData(neuronSimDataArray); // AXON INIT DATA if (axonInitDataCBuffer != null) { axonInitDataCBuffer.Release(); } axonInitDataCBuffer = new ComputeBuffer(tempAxonList.Count, sizeof(float) * 1 + sizeof(int) * 2); AxonInitData[] axonInitDataArray = new AxonInitData[tempAxonList.Count]; // for now only one seed data for (int x = 0; x < axonInitDataArray.Length; x++) { AxonInitData axonData = new AxonInitData(); axonData.weight = tempAxonList[x].weight; axonData.fromID = tempAxonList[x].fromID; axonData.toID = tempAxonList[x].toID; axonInitDataArray[x] = axonData; } axonInitDataCBuffer.SetData(axonInitDataArray); // AXON SIM DATA if (axonSimDataCBuffer != null) { axonSimDataCBuffer.Release(); } axonSimDataCBuffer = new ComputeBuffer(tempAxonList.Count, sizeof(float) * 13); // TRIANGLE BUFFER: // SET UP GEO BUFFER and REFS::::: if (appendTrianglesCBuffer != null) { appendTrianglesCBuffer.Release(); } Debug.Log("Max Tris: " + (numNeurons * maxTrisPerNeuron + tempAxonList.Count * maxTrisPerAxon).ToString()); appendTrianglesCBuffer = new ComputeBuffer(numNeurons * maxTrisPerNeuron + tempAxonList.Count * maxTrisPerAxon, sizeof(float) * 27, ComputeBufferType.Append); // vector3 position * 3 verts appendTrianglesCBuffer.SetCounterValue(0); // Hook Buffers Up to Shaders!!! // populate initial data for neurons // populate initial data for axons // feed neuronValues data to shader (encapsulate in function since this is ongoing) // simulate movements / animation parameters // generate neuron triangles // generate axon triangles int initKernelID = shaderComputeBrain.FindKernel("CSInitializeAxonSimData"); shaderComputeBrain.SetBuffer(initKernelID, "neuronInitDataCBuffer", neuronInitDataCBuffer); shaderComputeBrain.SetBuffer(initKernelID, "neuronFeedDataCBuffer", neuronFeedDataCBuffer); shaderComputeBrain.SetBuffer(initKernelID, "neuronSimDataCBuffer", neuronSimDataCBuffer); shaderComputeBrain.SetBuffer(initKernelID, "axonInitDataCBuffer", axonInitDataCBuffer); shaderComputeBrain.SetBuffer(initKernelID, "axonSimDataCBuffer", axonSimDataCBuffer); shaderComputeBrain.SetFloat("minAxonRadius", 0.02f); shaderComputeBrain.SetFloat("maxAxonRadius", 0.28f); shaderComputeBrain.SetFloat("minNeuronRadius", 0.8f); shaderComputeBrain.SetFloat("maxNeuronRadius", 1.5f); shaderComputeBrain.SetFloat("neuronAttractForce", 0.0001f); shaderComputeBrain.SetFloat("axonStraightenForce", .00001f); shaderComputeBrain.SetFloat("neuronRepelForce", 240.0f); shaderComputeBrain.SetFloat("axonRepelForce", 360f); int simNeuronAttractKernelID = shaderComputeBrain.FindKernel("CSSimNeuronAttract"); shaderComputeBrain.SetBuffer(simNeuronAttractKernelID, "neuronInitDataCBuffer", neuronInitDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronAttractKernelID, "neuronFeedDataCBuffer", neuronFeedDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronAttractKernelID, "neuronSimDataCBuffer", neuronSimDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronAttractKernelID, "axonInitDataCBuffer", axonInitDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronAttractKernelID, "axonSimDataCBuffer", axonSimDataCBuffer); int simNeuronRepelKernelID = shaderComputeBrain.FindKernel("CSSimNeuronRepel"); int simAxonRepelKernelID = shaderComputeBrain.FindKernel("CSSimAxonRepel"); int neuronTrianglesKernelID = shaderComputeBrain.FindKernel("CSGenerateNeuronTriangles"); shaderComputeBrain.SetBuffer(neuronTrianglesKernelID, "neuronInitDataCBuffer", neuronInitDataCBuffer); shaderComputeBrain.SetBuffer(neuronTrianglesKernelID, "neuronFeedDataCBuffer", neuronFeedDataCBuffer); shaderComputeBrain.SetBuffer(neuronTrianglesKernelID, "neuronSimDataCBuffer", neuronSimDataCBuffer); //shaderComputeBrain.SetBuffer(neuronTrianglesKernelID, "axonInitDataCBuffer", axonInitDataCBuffer); //shaderComputeBrain.SetBuffer(neuronTrianglesKernelID, "axonSimDataCBuffer", axonSimDataCBuffer); shaderComputeBrain.SetBuffer(neuronTrianglesKernelID, "appendTrianglesCBuffer", appendTrianglesCBuffer); int axonTrianglesKernelID = shaderComputeBrain.FindKernel("CSGenerateAxonTriangles"); shaderComputeBrain.SetBuffer(axonTrianglesKernelID, "neuronInitDataCBuffer", neuronInitDataCBuffer); shaderComputeBrain.SetBuffer(axonTrianglesKernelID, "neuronFeedDataCBuffer", neuronFeedDataCBuffer); shaderComputeBrain.SetBuffer(axonTrianglesKernelID, "neuronSimDataCBuffer", neuronSimDataCBuffer); shaderComputeBrain.SetBuffer(axonTrianglesKernelID, "axonInitDataCBuffer", axonInitDataCBuffer); shaderComputeBrain.SetBuffer(axonTrianglesKernelID, "axonSimDataCBuffer", axonSimDataCBuffer); shaderComputeBrain.SetBuffer(axonTrianglesKernelID, "appendTrianglesCBuffer", appendTrianglesCBuffer); displayMaterial = new Material(shaderDisplayBrain); displayMaterial.SetPass(0); displayMaterial.SetBuffer("appendTrianglesBuffer", appendTrianglesCBuffer); // link computeBuffer to both computeShader and displayShader so they share the same one!! shaderComputeBrain.Dispatch(initKernelID, numAxons, 1, 1); // initialize axon positions and attributes shaderComputeBrain.Dispatch(simNeuronAttractKernelID, numAxons, 1, 1); // Simulate!! move neuron and axons around shaderComputeBrain.Dispatch(simNeuronRepelKernelID, numNeurons, numNeurons, 1); // Simulate!! move neuron and axons around shaderComputeBrain.Dispatch(simAxonRepelKernelID, numAxons, numAxons, 1); // Simulate!! move neuron and axons around shaderComputeBrain.Dispatch(neuronTrianglesKernelID, numNeurons, 1, 1); // create all triangles from Neurons shaderComputeBrain.Dispatch(axonTrianglesKernelID, numAxons, 1, 1); // create all geometry for Axons args[0] = 0; // set later by counter;// 3; // 3 vertices to start args[1] = 1; // 1 instance/copy argsCBuffer.SetData(args); ComputeBuffer.CopyCount(appendTrianglesCBuffer, argsCBuffer, 0); argsCBuffer.GetData(args); Debug.Log("triangle count " + args[0]); }