void InitializeNeuronFeedDataCBuffer() { neuronFeedDataCBuffer?.Release(); neuronFeedDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 1); NeuronFeedData[] neuronValuesArray = new NeuronFeedData[numNeurons]; for (int i = 0; i < neuronValuesArray.Length; i++) { neuronValuesArray[i].curValue = neurons[i].currentValue; } neuronFeedDataCBuffer.SetData(neuronValuesArray); }
void UpdateBrainDataAndBuffers() { if (neurons == null || axons == null) { return; } NeuronFeedData[] neuronValuesArray = new NeuronFeedData[neurons.Count]; for (int i = 0; i < neuronValuesArray.Length; i++) { neuronValuesArray[i].curValue = neurons[i].currentValue; } neuronFeedDataCBuffer.SetData(neuronValuesArray); SetCoreBrainDataSharedParameters(shaderComputeBrain); UpdateNeuronBuffer("CSSimNeuronAttract", axons.Count, 1); UpdateNeuronBuffer("CSSimNeuronRepel", numNeurons, numNeurons); //UpdateNeuronBuffer("CSSimAxonRepel", axons.Count, axons.Count); // Regenerate triangles appendTrianglesCoreCBuffer?.Release(); //appendTrianglesCBuffer = new ComputeBuffer(numNeurons * maxTrisPerNeuron + numAxons * maxTrisPerAxon, sizeof(float) * 45, ComputeBufferType.Append); // vector3 position * 3 verts int maxTris = numNeurons * maxTrisPerNeuron; appendTrianglesCoreCBuffer = new ComputeBuffer(maxTris, sizeof(float) * 45, ComputeBufferType.Append); appendTrianglesCoreCBuffer.SetCounterValue(0); SetCoreTrianglesBuffer("CSGenerateNeuronTriangles", neurons.Count); SetAxonTrianglesBuffer("CSGenerateAxonTriangles", axons.Count); displayMaterialCore.SetPass(0); displayMaterialCore.SetBuffer("appendTrianglesCoreCBuffer", appendTrianglesCoreCBuffer); SetArgsBuffer(argsCore, argsCoreCBuffer, appendTrianglesCoreCBuffer); //SetArgsBuffer(argsCables, argsCablesCBuffer, appendTrianglesCablesCBuffer); }
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]); }
private void UpdateBrainDataAndBuffers() { // NEURON FEED DATA //if (neuronFeedDataCBuffer != null) // neuronFeedDataCBuffer.Release(); //neuronFeedDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 1); if (tempNeuronList == null) { return; } if (tempAxonList == null) { return; } NeuronFeedData[] neuronValuesArray = new NeuronFeedData[tempNeuronList.Count]; for (int i = 0; i < neuronValuesArray.Length; i++) { neuronValuesArray[i].curValue = Mathf.Sin(Time.fixedTime * 1.25f + tempNeuronList[i].currentValue[0]); } neuronFeedDataCBuffer.SetData(neuronValuesArray); // For some reason I have to setBuffer on all of these for it to WORK!!!!!!!! (even though they are all the same in the shader...) // For some reason I have to setBuffer on all of these for it to WORK!!!!!!!! // For some reason I have to setBuffer on all of these for it to WORK!!!!!!!! shaderComputeBrain.SetFloat("minAxonRadius", minAxonRadius); shaderComputeBrain.SetFloat("maxAxonRadius", maxAxonRadius); shaderComputeBrain.SetFloat("minNeuronRadius", minNeuronRadius); shaderComputeBrain.SetFloat("maxNeuronRadius", maxNeuronRadius); shaderComputeBrain.SetFloat("neuronAttractForce", neuronAttractForce); shaderComputeBrain.SetFloat("axonStraightenForce", axonStraightenForce); shaderComputeBrain.SetFloat("neuronRepelForce", neuronRepelForce); shaderComputeBrain.SetFloat("axonRepelForce", axonRepelForce); 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); shaderComputeBrain.Dispatch(simNeuronAttractKernelID, numAxons, 1, 1); // Simulate!! move neuron and axons around int simNeuronRepelKernelID = shaderComputeBrain.FindKernel("CSSimNeuronRepel"); shaderComputeBrain.SetBuffer(simNeuronRepelKernelID, "neuronInitDataCBuffer", neuronInitDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronRepelKernelID, "neuronFeedDataCBuffer", neuronFeedDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronRepelKernelID, "neuronSimDataCBuffer", neuronSimDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronRepelKernelID, "axonInitDataCBuffer", axonInitDataCBuffer); shaderComputeBrain.SetBuffer(simNeuronRepelKernelID, "axonSimDataCBuffer", axonSimDataCBuffer); shaderComputeBrain.Dispatch(simNeuronRepelKernelID, numNeurons, numNeurons, 1); // Simulate!! move neuron and axons around int simAxonRepelKernelID = shaderComputeBrain.FindKernel("CSSimAxonRepel"); shaderComputeBrain.SetBuffer(simAxonRepelKernelID, "neuronInitDataCBuffer", neuronInitDataCBuffer); shaderComputeBrain.SetBuffer(simAxonRepelKernelID, "neuronFeedDataCBuffer", neuronFeedDataCBuffer); shaderComputeBrain.SetBuffer(simAxonRepelKernelID, "neuronSimDataCBuffer", neuronSimDataCBuffer); shaderComputeBrain.SetBuffer(simAxonRepelKernelID, "axonInitDataCBuffer", axonInitDataCBuffer); shaderComputeBrain.SetBuffer(simAxonRepelKernelID, "axonSimDataCBuffer", axonSimDataCBuffer); shaderComputeBrain.Dispatch(simAxonRepelKernelID, numAxons, numAxons, 1); // Simulate!! move neuron and axons around //shaderComputeBrain.Dispatch(simulateKernelID, tempAxonList.Count, 1, 1); // Simulate!! move neuron and axons around // Re-Generate TRIANGLES! // SET UP GEO BUFFER and REFS::::: if (appendTrianglesCBuffer != null) { appendTrianglesCBuffer.Release(); } //Debug.Log("Max Tris: " + (numNeurons * maxTrisPerNeuron + numAxons * maxTrisPerAxon).ToString()); appendTrianglesCBuffer = new ComputeBuffer(numNeurons * maxTrisPerNeuron + numAxons * maxTrisPerAxon, sizeof(float) * 27, ComputeBufferType.Append); // vector3 position * 3 verts appendTrianglesCBuffer.SetCounterValue(0); 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); //displayMaterial.SetPass(0); //displayMaterial.SetBuffer("appendTrianglesBuffer", appendTrianglesCBuffer); //int neuronTrianglesKernelID = shaderComputeBrain.FindKernel("CSGenerateNeuronTriangles"); //int axonTrianglesKernelID = shaderComputeBrain.FindKernel("CSGenerateAxonTriangles"); shaderComputeBrain.Dispatch(neuronTrianglesKernelID, tempNeuronList.Count, 1, 1); // create all triangles from Neurons shaderComputeBrain.Dispatch(axonTrianglesKernelID, tempAxonList.Count, 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]); /*NeuronFeedData[] neuronValuesArray = new NeuronFeedData[refBrain.neuronList.Count]; * for (int i = 0; i < neuronValuesArray.Length; i++) { * neuronValuesArray[i].curValue = refBrain.neuronList[i].currentValue[0]; * } * neuronFeedDataCBuffer.SetData(neuronValuesArray);*/ }