Beispiel #1
0
    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);
    }
Beispiel #2
0
    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);
    }
Beispiel #4
0
    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);
    }
Beispiel #5
0
    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);
    }