Exemple #1
0
        public void ComputeGrassFor(IEnvironmentSurface chunk)
        {
            MeshData meshData = chunk.MeshData;
            int      numTris  = meshData.vertices.Length / 3;

            vertexBuffer.SetData(meshData.vertices);

            int numThreadPerAxis = Mathf.Max(1, Mathf.CeilToInt(numTris / THREAD_SIZE_GROUP));

            grassProperties = new ComputeBuffer(GRASS_PER_COMPUTE, MeshInstancedProperties.Size(), ComputeBufferType.Append);
            grassProperties.SetCounterValue(0);
            Material       mat     = new Material(this.mat);
            Maybe <Bounds> mBounds = chunk.MeshBounds;
            Vector3        offset  = mBounds.Value.center;

            grassShader.SetInt(NAME_OF_TRIANGLE_LENGTH, numTris);
            grassShader.SetVector(NAME_OF_OFFSET, offset);
            grassShader.SetFloat(NAME_OF_BOUNDS, grassMesh.bounds.extents.y);
            grassShader.SetBuffer(0, NAME_OF_TRIANGLE_BUFFER, vertexBuffer);
            grassShader.SetBuffer(0, NAME_OF_GRASS_BUFFER, grassProperties);

            grassShader.Dispatch(0, numThreadPerAxis, 1, 1);

            new InstantiatableData(grassMesh, grassProperties, mat, mBounds);
            grassProperties = null;
        }
Exemple #2
0
        public InstanciableData(Mesh instanceMesh, int count, ComputeBuffer instanceTransformations, Material material, Bounds bounds)
        {
            this.material = material;
            this.instanceTransformations = instanceTransformations;
            this.bounds       = bounds;
            this.instanceMesh = instanceMesh;
            args = new uint[]
            {
                instanceMesh.GetIndexCount(0),
                0,
                instanceMesh.GetIndexStart(0),
                instanceMesh.GetBaseVertex(0),
                0
            };


            //Color[] colors = new Color[instanceMesh.vertexCount];
            //for (int i = 0; i < colors.Length; i++)
            //{
            //    colors[i] = Color.red;
            //}
            //instanceMesh.colors = colors;
            argsBuffer           = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
            meshPropertiesBuffer = argsBuffer;
            argsBuffer.SetData(args);


            //MeshInstancedProperties props = new MeshInstancedProperties();
            //Vector3 position = new Vector3(1, 2, 3);
            //Quaternion rotation = Quaternion.identity;
            //Vector3 scale = Vector3.one * 3;
            //props.mat = Matrix4x4.TRS(position, rotation, scale);

            //float[] vals = new float[16];
            //for (int column = 0; column < 4; column++)
            //{
            //    for (int row = 0; row < 4; row++)
            //    {
            //        vals[column * 4 + row] = props.mat[1];
            //    }
            //}


            //MeshInstancedProperties[] mesh = new MeshInstancedProperties[count];
            //ExtensionArray.Fill(mesh, props);
            //instanceTransformations.SetData(mesh);

            material.SetBuffer(MATERIAL_PROPERTY_BUFFER_NAME, instanceTransformations);

            ComputeBuffer.CopyCount(instanceTransformations, argsBuffer, 4);

            argsBuffer.GetData(args);
            MeshInstancedProperties[] propss = new MeshInstancedProperties[args[1]];
            instanceTransformations.GetData(propss);


            MeshInstantiator.meshInstantiator.AddData(this);
        }
        public void ComputeGrassFor(Bounds bounds, int numTris, ComputeBuffer triangleData)
        {
            int numThreadPerAxis = Mathf.Max(1, Mathf.CeilToInt(numTris / 32f));

            grassProperties = new ComputeBuffer(GRASS_PER_COMPUTE, MeshInstancedProperties.Size(), ComputeBufferType.Append);
            grassProperties.SetCounterValue(0);
            Material mat    = new Material(this.mat);
            Vector3  offset = bounds.center;

            grassShader.SetInt(NAME_OF_TRIANGLE_LENGTH, numTris);
            grassShader.SetVector(NAME_OF_OFFSET, offset);
            grassShader.SetFloat(NAME_OF_BOUNDS, grassMesh.bounds.extents.y);
            grassShader.SetBuffer(0, NAME_OF_TRIANGLE_BUFFER, triangleData);
            grassShader.SetBuffer(0, NAME_OF_GRASS_BUFFER, grassProperties);

            grassShader.Dispatch(0, numThreadPerAxis, 1, 1);

            new InstanciableData(grassMesh, numTris, grassProperties, mat, bounds);
            grassProperties = null;
        }