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; }
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; }