private void CreateTile(IntegerCoordinate2D coordinate)
 {
     _collisionTileBuffer.Add(coordinate, TerrainCollisionTile.Instantiate(coordinate, this));
 }
コード例 #2
0
        public static IEnumerator GetChunkData(CollisionBaseData[] inputData, TerrainCollisionController controller, TerrainCollisionTile tile)
        {
            var settings = controller.terrainController.terrainGeneratorSettings;
            var shader = controller.terrainCollisionComputeShader;
            
            var kernel = shader.FindKernel("ComputeOffsets");
            
            var dataBuffer = new ComputeBuffer(inputData.Length, 40); //See CollisionBaseData summary
            dataBuffer.SetData(inputData);
            
            var outputData = new float[inputData.Length];
            for(var i = 0; i < inputData.Length; i++)
            {
                outputData[i] = 10;
            }
            var outputBuffer = new ComputeBuffer(outputData.Length, 4); //Float = 4 Bytes
            outputBuffer.SetData(outputData);
            
            TerrainUtilities.TransferTerrainGeneratorSettingsToComputeShader(shader, settings);
            
            shader.SetBuffer(kernel, "_BaseData", dataBuffer);
            shader.SetBuffer(kernel, "_FullData", outputBuffer);
            shader.SetInt("_size", inputData.Length);
            
            //Obtain base shader data.
            controller.terrainController.SetMainComputeShaderData(shader, kernel);
            
            //Dispatch the main Kernel
            shader.Dispatch(kernel, Mathf.CeilToInt(inputData.Length / 8.0f), 1, 1);

            //Wait for the requests to finish asynchronously
            var request = AsyncGPUReadback.Request(outputBuffer);
            yield return new WaitUntil(() => request.done);
            
            //Write results back to tile
            tile.displacements = request.GetData<float>().ToArray();
            
            //Clean up GPU buffers
            dataBuffer.Release();
            dataBuffer.Dispose();
            outputBuffer.Release();
            outputBuffer.Dispose();
            yield return null;
        }