void OnEnable() { m_mesh = new Mesh(); m_mesh = PrimitiveMeshFactory.BoxFlatShaded(); m_spherePhase = 0.0f; m_aSphere = new GameObject[kNumSpheres]; m_aSpherePrevPos = new Vector3[kNumSpheres]; m_aSphereVel = new Vector4[kNumSpheres]; for (int i = 0; i < kNumSpheres; ++i) { m_aSphere[i] = Instantiate(m_spherePrefab); m_aSpherePrevPos[i] = Vector3.zero; } m_floor = Instantiate(m_floorPrefab); int particleStride = sizeof(float) * 24; m_computeBuffer = new ComputeBuffer(kNumParticles, particleStride); uint[] instanceArgs = new uint[] { 0, 0, 0, 0, 0 }; m_instanceArgsBuffer = new ComputeBuffer(1, instanceArgs.Length * sizeof(uint), ComputeBufferType.IndirectArguments); instanceArgs[0] = (uint)m_mesh.GetIndexCount(0); instanceArgs[1] = (uint)kNumParticles; instanceArgs[2] = (uint)m_mesh.GetIndexStart(0); instanceArgs[3] = (uint)m_mesh.GetBaseVertex(0); m_instanceArgsBuffer.SetData(instanceArgs); m_csInitKernelId = m_shader.FindKernel("Init"); m_csStepKernelId = m_shader.FindKernel("Step"); m_csParticleBufferId = Shader.PropertyToID("particleBuffer"); m_csScaleId = Shader.PropertyToID("scale"); m_csSpeedId = Shader.PropertyToID("speed"); m_csLifetimeId = Shader.PropertyToID("lifetime"); m_csNumParticlesId = Shader.PropertyToID("numParticles"); m_csTimeId = Shader.PropertyToID("time"); m_csDynamics = Shader.PropertyToID("dynamics"); m_csASphere = Shader.PropertyToID("aSphere"); m_csASphereVel = Shader.PropertyToID("aSphereVel"); m_csPlane = Shader.PropertyToID("plane"); m_material = new Material(Shader.Find("CjLib/Example/GpuParticlesWithColliders")); m_material.enableInstancing = true; m_material.SetBuffer(m_csParticleBufferId, m_computeBuffer); m_materialProperties = new MaterialPropertyBlock(); m_shader.SetFloats(m_csScaleId, new float[] { 0.1f, 0.15f }); m_shader.SetFloats(m_csSpeedId, new float[] { 1.0f, 1.5f, 1.0f, 6.0f }); m_shader.SetFloats(m_csLifetimeId, new float[] { 0.1f, 3.0f, 3.0f, 0.1f }); m_shader.SetInt(m_csNumParticlesId, kNumParticles); m_shader.SetBuffer(m_csInitKernelId, m_csParticleBufferId, m_computeBuffer); m_shader.SetBuffer(m_csStepKernelId, m_csParticleBufferId, m_computeBuffer); m_shader.Dispatch(m_csInitKernelId, kNumParticles, 1, 1); }
void OnEnable() { m_mesh = new Mesh(); m_mesh = PrimitiveMeshFactory.BoxFlatShaded(); int particleStride = sizeof(float) * 24; m_computeBuffer = new ComputeBuffer(kNumParticles, particleStride); uint[] instanceArgs = new uint[] { 0, 0, 0, 0, 0 }; m_instanceArgsBuffer = new ComputeBuffer(1, instanceArgs.Length * sizeof(uint), ComputeBufferType.IndirectArguments); instanceArgs[0] = (uint)m_mesh.GetIndexCount(0); instanceArgs[1] = (uint)kNumParticles; instanceArgs[2] = (uint)m_mesh.GetIndexStart(0); instanceArgs[3] = (uint)m_mesh.GetBaseVertex(0); m_instanceArgsBuffer.SetData(instanceArgs); //m_debugBuffer = new Particle[kNumParticles]; m_csInitKernelId = m_shader.FindKernel("Init"); m_csStepKernelId = m_shader.FindKernel("Step"); m_csParticleBufferId = Shader.PropertyToID("particleBuffer"); m_csScaleId = Shader.PropertyToID("scale"); m_csDampingId = Shader.PropertyToID("damping"); m_csSpeedId = Shader.PropertyToID("speed"); m_csLifetimeId = Shader.PropertyToID("lifetime"); m_csNumParticlesId = Shader.PropertyToID("numParticles"); m_csTimeId = Shader.PropertyToID("time"); m_material = new Material(Shader.Find("CjLib/Example/TurbulentRainbowGpuParticles")); m_material.enableInstancing = true; m_material.SetBuffer(m_csParticleBufferId, m_computeBuffer); m_materialProperties = new MaterialPropertyBlock(); m_shader.SetFloats(m_csScaleId, new float[] { 0.15f, 0.3f }); m_shader.SetFloat(m_csDampingId, 6.0f); m_shader.SetFloats(m_csSpeedId, new float[] { 3.0f, 4.0f, 1.0f, 6.0f }); m_shader.SetFloats(m_csLifetimeId, new float[] { 0.1f, 0.5f, 0.5f, 0.1f }); m_shader.SetInt(m_csNumParticlesId, kNumParticles); m_shader.SetBuffer(m_csInitKernelId, m_csParticleBufferId, m_computeBuffer); m_shader.SetBuffer(m_csStepKernelId, m_csParticleBufferId, m_computeBuffer); m_shader.Dispatch(m_csInitKernelId, kNumParticles, 1, 1); //m_computeBuffer.GetData(m_debugBuffer); }
void OnEnable() { m_mesh = new Mesh(); m_mesh = PrimitiveMeshFactory.BoxFlatShaded(); m_controlSphere = Instantiate(m_controlSpherePrefab); m_cSpherePrevPos = Vector3.zero; m_floor = Instantiate(m_floorPrefab); int particleStride = sizeof(float) * 24; m_computeBuffer = new ComputeBuffer(kNumParticles, particleStride); uint[] instanceArgs = new uint[] { 0, 0, 0, 0, 0 }; //5 indices: index count per instance, instance count, start index location, base vertex location, start instance location. m_instanceArgsBuffer = new ComputeBuffer(1, instanceArgs.Length * sizeof(uint), ComputeBufferType.IndirectArguments); instanceArgs[0] = (uint)m_mesh.GetIndexCount(0); instanceArgs[1] = (uint)kNumParticles; instanceArgs[2] = (uint)m_mesh.GetIndexStart(0); instanceArgs[3] = (uint)m_mesh.GetBaseVertex(0); //start instance location is always 0 m_instanceArgsBuffer.SetData(instanceArgs); m_csInitKernelId = m_shader.FindKernel("Init"); // Kernel used to initialize particle location. (in ParticleLogic.compute) m_csStepKernelId = m_shader.FindKernel("Step"); // Kernel used to update particles per frame // We'll need ids to manage uniforms inside the shaders. // Note how to get them... They share a global namespace! m_csParticleBufferId = Shader.PropertyToID("particleBuffer"); m_csScaleId = Shader.PropertyToID("scale"); m_csSpeedId = Shader.PropertyToID("speed"); m_csLifetimeId = Shader.PropertyToID("lifetime"); m_csNumParticlesId = Shader.PropertyToID("numParticles"); m_csTimeId = Shader.PropertyToID("time"); m_csDynamics = Shader.PropertyToID("dynamics"); m_csASphere = Shader.PropertyToID("aSphere"); m_csASphereVel = Shader.PropertyToID("aSphereVel"); m_csPlane = Shader.PropertyToID("plane"); m_csDamp = Shader.PropertyToID("damping"); m_materialProperties = new MaterialPropertyBlock(); InitParticles(); // Init: Setup materials & shaders }