void InitBoidCS() { calCenterKernelHandle = boidCS.FindKernel("CalCenterCS"); buildGridKernelHandle = boidCS.FindKernel("BuildGridCS"); clearGridIndicesKernelHandle = boidCS.FindKernel("ClearGridIndicesCS"); buildGridIndicesKernelHandle = boidCS.FindKernel("BuildGridIndicesCS"); rearrangeParticlesKernelHandle = boidCS.FindKernel("RearrangeParticlesCS"); boidsGridKernelHandle = boidCS.FindKernel("BoidsCS_Grid"); cbBoid[0] = new ComputeBuffer(boidsCount, 32); cbBoid [1] = new ComputeBuffer(boidsCount, 32); cbGrid = new ComputeBuffer(boidsCount, 8); //cbGridIndices = new ComputeBuffer(1<<24, 4);//xyz分别分配8位 //start&end int2啊!艹! cbGridIndices = new ComputeBuffer(1 << 24, 8); cbBoidsCenter = new ComputeBuffer(1, 12); //just for initialization,cpu to gpu GPUBoid[] boidsData = new GPUBoid[boidsCount]; for (int i = 0; i < boidsCount; i++) { boidsData[i] = CreateBoidData(); } cbBoid[0].SetData(boidsData); boidCS.SetInt("gBoidsCount", boidsCount); boidCS.SetFloat("gNearByDist", nearbyDis); }
void Start() { kernelHandle = cshader.FindKernel("CSMain"); //int stride = sizeof(GPUBoid); //int stride=sizeof(Vector3)*2+sizeof(float)*2; int stride = 32; cbuffer = new ComputeBuffer(boidsCount, stride); boidsGo = new GameObject[boidsCount]; //just for initialization,cpu to gpu GPUBoid[] boidsData = new GPUBoid[boidsCount]; for (int i = 0; i < boidsCount; i++) { boidsData[i] = CreateBoidData(); boidsGo[i] = Instantiate(boidPrefab, boidsData[i].pos, Quaternion.Slerp(transform.rotation, Random.rotation, 0.3f)) as GameObject; boidsData[i].rot = boidsGo[i].transform.forward; Material mtrl = boidsGo[i].GetComponent <Renderer>().material; //mtrl.SetPass(0); mtrl.SetInt("_boidID", i); mtrl.SetBuffer("_boidBuffer", cbuffer); } cbuffer.SetData(boidsData); cshader.SetBuffer(kernelHandle, "gBoidBuffer", cbuffer); cshader.SetInt("gBoidsCount", boidsCount); cshader.SetFloat("gNearByDist", nearbyDis); }
GPUBoid CreateBoidData() { GPUBoid boidData = new GPUBoid(); Vector3 pos = transform.position + Random.insideUnitSphere * spawnRadius; boidData.pos = pos; boidData.rot = new Vector3(0f, 0f, 1f); boidData.speed = flockSpeed + Random.Range(-0.5f, 0.5f); boidData.rotSpeed = flockRotSpeed + Random.Range(-0.5f, 0.5f); return(boidData); }
GPUBoid CreateBoidData() { GPUBoid boidData = new GPUBoid(); Vector3 pos = transform.position + Random.insideUnitSphere * SpawnRadius; Quaternion rot = Quaternion.Slerp(transform.rotation, Random.rotation, 0.3f); boidData.position = pos; boidData.direction = rot.eulerAngles; boidData.noise_offset = Random.value * 1000.0f; boidData.size = Random.Range(0.5f, 1.5f); return(boidData); }
GPUBoid CreateBoidData() { GPUBoid boidData = new GPUBoid(); Vector3 pos = transform.position + Random.insideUnitSphere * spawnRadius; Quaternion rot = Quaternion.Slerp(transform.rotation, Random.rotation, 0.3f); boidData.pos = pos; boidData.flockPos = transform.position; boidData.boidsCount = this.boidsCount; boidData.nearbyDis = this.nearbyDis; boidData.speed = this.flockSpeed + Random.Range(-0.5f, 0.5f); return(boidData); }
void Start() { kernelHandle = cshader.FindKernel("CSMain"); int stride = 32; cbuffer = new ComputeBuffer(boidsCount, stride); //just for initialization,cpu to gpu GPUBoid[] boidsData = new GPUBoid[boidsCount]; for (int i = 0; i < boidsCount; i++) { boidsData[i] = CreateBoidData(); } cbuffer.SetData(boidsData); cshader.SetBuffer(kernelHandle, "gBoidBuffer", cbuffer); cshader.SetInt("gBoidsCount", boidsCount); cshader.SetFloat("gNearByDist", nearbyDis); }