private TerrainDetailGenerator CreateTerrainDetailGenerator(
            Texture mainTexture,
            UTTextureRendererProxy utTextureRendererProxy,
            CommonExecutorUTProxy commonExecutorUtProxy,
            UnityThreadComputeShaderExecutorObject computeShaderExecutorObject,
            ComputeShaderContainerGameObject containerGameObject)
        {
            var featureAppliers = new List <RankedTerrainFeatureApplier>();

            if (_configuration.EngraveTerrainFeatures)
            {
                featureAppliers.AddRange(FinalTerrainFeatureAppliers.CreateFeatureAppliers(
                                             utTextureRendererProxy, containerGameObject, commonExecutorUtProxy, computeShaderExecutorObject
                                             ));
            }
            if (_configuration.EngraveRoadsInTerrain)
            {
                featureAppliers.Add(FinalTerrainFeatureAppliers.CreateRoadEngravingApplier(CreateRoadEngravingFeatureApplier()));
            }

            TerrainDetailGeneratorConfiguration generatorConfiguration =
                _configuration.TerrainDetailGeneratorConfiguration;

            TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize()
            {
                Texture = mainTexture,
                Size    = new IntVector2(mainTexture.width, mainTexture.height)
            }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator = new TerrainDetailGenerator(generatorConfiguration,
                                                                          utTextureRendererProxy, fullFundationData, featureAppliers, commonExecutorUtProxy);

            return(generator);
        }
예제 #2
0
        public static TerrainDetailGenerator CreateTerrainDetailGenerator(
            Texture mainTexture, UTTextureRendererProxy utTextureRendererProxy,
            CommonExecutorUTProxy commonExecutorUtProxy,
            UnityThreadComputeShaderExecutorObject computeShaderExecutorObject,
            ComputeShaderContainerGameObject containerGameObject)
        {
            var featureAppliers =
                TerrainDetailProviderDebugUtils.CreateFeatureAppliers(utTextureRendererProxy, containerGameObject,
                                                                      commonExecutorUtProxy, computeShaderExecutorObject);

            TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration()
            {
                TerrainDetailImageSideDisjointResolution = 240
            };
            TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize()
            {
                Texture = mainTexture,
                Size    = new IntVector2(mainTexture.width, mainTexture.height)
            }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator =
                new TerrainDetailGenerator(generatorConfiguration, utTextureRendererProxy, fullFundationData,
                                           featureAppliers, commonExecutorUtProxy);

            return(generator);
        }
예제 #3
0
        public async Task <TextureWithCoords> ApplyFeatureAsync(TextureWithCoords texture,
                                                                TerrainCardinalResolution resolution, bool canMultistep)
        {
            var configuration = _configurations[resolution];

            var detailedHeightmapArray = await TaskUtils
                                         .RunInThreadPool(
                () =>
            {
                var creator      = new DiamondSquareCreator(_randomProviderGenerator.GetRandom());
                var initialArray = creator.CreateDiamondSquareNoiseArray(
                    texture.TextureSize,
                    configuration.DiamondSquareWorkingArrayLength);
                return(initialArray);
            });

            var detailedTexture = await _commonExecutor
                                  .AddAction(() => HeightmapUtils.CreateTextureFromHeightmap(detailedHeightmapArray));


            UniformsPack pack = new UniformsPack();

            pack.SetTexture("_Texture1", texture.Texture);
            pack.SetTexture("_Texture2", detailedTexture);
            pack.SetUniform("_Texture2Weight", configuration.DiamondSquareWeight);

            var renderCoords = new MyRectangle(0, 0, 1, 1);

            var outTextureSize = texture.TextureSize;

            ConventionalTextureInfo outTextureInfo =
                new ConventionalTextureInfo(outTextureSize.X, outTextureSize.Y, TextureFormat.ARGB32, true);
            TextureRenderingTemplate template = new TextureRenderingTemplate()
            {
                CanMultistep        = canMultistep,
                Coords              = renderCoords,
                OutTextureInfo      = outTextureInfo,
                RenderTextureFormat = RenderTextureFormat.RFloat,
                ShaderName          = "Custom/TerrainCreation/DiamondSquareTextureAddingPlain",
                UniformPack         = pack,
                CreateTexture2D     = false
            };

            var renderedTexture = await _rendererProxy.AddOrder(template);

            await _commonExecutor.AddAction(() => GameObject.Destroy(detailedTexture));

            return(new TextureWithCoords(sizedTexture: new TextureWithSize()
            {
                Texture = renderedTexture,
                Size = texture.TextureSize
            }, coords: texture.Coords));
        }
예제 #4
0
        public async Task <TextureWithCoords> ApplyFeatureAsync(TextureWithCoords inputTexture,
                                                                TerrainCardinalResolution resolution, bool CanMultistep = false)
        {
            if (!TaskUtils.GetGlobalMultithreading())
            {
                Preconditions.Assert(inputTexture.Texture.width == inputTexture.Texture.height,
                                     "Only square inputTextures are supported");
            }
            UniformsPack pack = new UniformsPack();
            await _commonExecutor.AddAction(() => inputTexture.Texture.filterMode = FilterMode.Point);

            pack.SetTexture("_SourceTexture", inputTexture.Texture);
            pack.SetUniform("_InputGlobalCoords", inputTexture.Coords.ToVector4());
            pack.SetUniform("_QuantingResolution", inputTexture.TextureSize.X - 1);


            var configuration = _configurations[resolution];

            pack.SetUniform("_DetailResolutionMultiplier", configuration.DetailResolutionMultiplier);
            pack.SetUniform("_NoiseStrengthMultiplier", configuration.NoiseStrengthMultiplier);

            var renderCoords = new MyRectangle(0, 0, 1, 1);

            var outTextureSize = inputTexture.TextureSize;

            ConventionalTextureInfo outTextureInfo =
                new ConventionalTextureInfo(outTextureSize.X, outTextureSize.Y, TextureFormat.ARGB32, true);
            TextureRenderingTemplate template = new TextureRenderingTemplate()
            {
                CanMultistep        = false,
                Coords              = renderCoords,
                OutTextureInfo      = outTextureInfo,
                RenderTextureFormat = RenderTextureFormat.RFloat,
                ShaderName          = "Custom/TerrainCreation/NoiseAddingPlain",
                UniformPack         = pack,
                CreateTexture2D     = false
            };

            return(new TextureWithCoords(sizedTexture: new TextureWithSize()
            {
                Texture = await _rendererProxy.AddOrder(template),
                Size = inputTexture.TextureSize
            }, coords: inputTexture.Coords));
        }
        private TerrainDetailProvider CreateTerrainDetailProvider(List <RankedTerrainFeatureApplier> featureAppliers,
                                                                  TextureWithSize globalHeightTexture)
        {
            TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration()
            {
                TerrainDetailImageSideDisjointResolution = 240
            };
            TextureWithCoords fullFundationData = new TextureWithCoords(sizedTexture: globalHeightTexture,
                                                                        coords: new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator =
                new TerrainDetailGenerator(generatorConfiguration, _utTextureRendererProxy, fullFundationData,
                                           featureAppliers, _commonExecutor);

            TerrainDetailProvider provider =
                new TerrainDetailProvider(generator, null, new TerrainDetailAlignmentCalculator(240));

            return(provider);
        }
        private TerrainDetailProvider CreateTerrainDetailProvider(List <RankedTerrainFeatureApplier> featureAppliers,
                                                                  Texture mainTexture)
        {
            TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration()
            {
                TerrainDetailImageSideDisjointResolution = 240
            };
            TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize()
            {
                Texture = mainTexture,
                Size    = new IntVector2(mainTexture.width, mainTexture.height)
            }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator =
                new TerrainDetailGenerator(generatorConfiguration, _utTextureRendererProxy, fullFundationData,
                                           featureAppliers, new CommonExecutorUTProxy());

            TerrainDetailProvider provider =
                new TerrainDetailProvider(generator, null, new TerrainDetailAlignmentCalculator(240));

            generator.SetBaseTerrainDetailProvider(BaseTerrainDetailProvider.CreateFrom(provider));
            return(provider);
        }
        public async Task <TextureWithCoords> ApplyFeatureAsync(TextureWithCoords texture,
                                                                TerrainCardinalResolution resolution, bool canMultistep)
        {
            ComputeShaderParametersContainer parametersContainer = new ComputeShaderParametersContainer();
            IntVector2 textureSize = texture.TextureSize;

            var heightComputeBuffer = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4,
                Type   = ComputeBufferType.Default
            });
            var outRenderTexture = parametersContainer.AddComputeShaderTextureTemplate(
                new MyComputeShaderTextureTemplate()
            {
                Size            = textureSize,
                Depth           = 24,
                EnableReadWrite = true,
                Format          = RenderTextureFormat.RFloat,
                TexWrapMode     = TextureWrapMode.Clamp,
            });

            MultistepComputeShader transferComputeShader =
                new MultistepComputeShader(_computeShaderContainer.HeightTransferShaderPlain, textureSize);
            var textureToBufferKernel = transferComputeShader.AddKernel("CSHeightTransform_InputTextureToBuffer");
            var bufferToTextureKernel = transferComputeShader.AddKernel("CSHeightTransform_BufferToOutputTexture");

            transferComputeShader.SetGlobalUniform("g_sideLength", textureSize.X);

            var inputHeightTexture = parametersContainer.AddExistingComputeShaderTexture(texture.Texture);

            transferComputeShader.SetTexture("InputHeightTexture", inputHeightTexture,
                                             new List <MyKernelHandle>()
            {
                textureToBufferKernel
            });

            transferComputeShader.SetTexture("OutputHeightTexture", outRenderTexture,
                                             new List <MyKernelHandle>()
            {
                bufferToTextureKernel
            });

            transferComputeShader.SetBuffer("HeightBuffer", heightComputeBuffer,
                                            new List <MyKernelHandle>()
            {
                textureToBufferKernel, bufferToTextureKernel
            });
            //////////////////////////////

            MultistepComputeShader thermalErosionComputeShader =
                new MultistepComputeShader(_computeShaderContainer.TweakedThermalErosionShader, textureSize);
            var kernel1 = thermalErosionComputeShader.AddKernel("CSTweakedThermal_Precalculation");
            var kernel2 = thermalErosionComputeShader.AddKernel("CSTweakedThermal_Erosion");

            var configuration = _configurations[resolution];

            thermalErosionComputeShader.SetGlobalUniform("g_tParam", configuration.TParam);
            thermalErosionComputeShader.SetGlobalUniform("g_cParam", configuration.CParam);
            thermalErosionComputeShader.SetGlobalUniform("g_sideLength", textureSize.X);

            thermalErosionComputeShader.SetTexture("InputHeightTexture", inputHeightTexture,
                                                   new List <MyKernelHandle>()
            {
                kernel1
            });

            thermalErosionComputeShader.SetBuffer("HeightBuffer0", heightComputeBuffer,
                                                  new List <MyKernelHandle>()
            {
                kernel1, kernel2
            });

            var MyHeightBuffer1 = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4,
                Type   = ComputeBufferType.Default
            });

            thermalErosionComputeShader.SetBuffer("HeightBuffer1", MyHeightBuffer1,
                                                  new List <MyKernelHandle>()
            {
                kernel1, kernel2
            });

            var MyMidTextureBuffer = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4 * 2,
                Type   = ComputeBufferType.Default
            });

            thermalErosionComputeShader.SetBuffer("MidTextureBuffer", MyMidTextureBuffer,
                                                  new List <MyKernelHandle>()
            {
                kernel1, kernel2
            });

            var outParameters = new ComputeBufferRequestedOutParameters(new List <MyComputeShaderTextureId>()
            {
                outRenderTexture
            });
            await _shaderExecutorObject.AddOrder(new ComputeShaderOrder()
            {
                OutParameters       = outParameters,
                ParametersContainer = parametersContainer,
                WorkPacks           = new List <ComputeShaderWorkPack>()
                {
                    new ComputeShaderWorkPack()
                    {
                        Shader        = transferComputeShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = new List <MyKernelHandle>()
                                {
                                    textureToBufferKernel
                                }
                            }
                        }
                    },
                    new ComputeShaderWorkPack()
                    {
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 30,
                                KernelHandles = new List <MyKernelHandle>()
                                {
                                    kernel1, kernel2
                                }
                            },
                        },
                        Shader = thermalErosionComputeShader
                    },
                    new ComputeShaderWorkPack()
                    {
                        Shader        = transferComputeShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = new List <MyKernelHandle>()
                                {
                                    bufferToTextureKernel
                                }
                            }
                        }
                    },
                }
            });

            return(new TextureWithCoords(sizedTexture: new TextureWithSize()
            {
                Texture = outParameters.RetriveTexture(outRenderTexture),
                Size = texture.TextureSize
            }, coords: texture.Coords));
        }
        public async Task <TextureWithCoords> ApplyFeatureAsync(TextureWithCoords texture,
                                                                TerrainCardinalResolution resolution, bool canMultistep)
        {
            ComputeShaderParametersContainer parametersContainer = new ComputeShaderParametersContainer();
            IntVector2 textureSize = texture.TextureSize;

            var heightComputeBuffer = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4,
                Type   = ComputeBufferType.Default
            });
            var outRenderTexture = parametersContainer.AddComputeShaderTextureTemplate(
                new MyComputeShaderTextureTemplate()
            {
                Depth           = 24,
                EnableReadWrite = true,
                Format          = RenderTextureFormat.RFloat,
                Size            = textureSize,
                TexWrapMode     = TextureWrapMode.Clamp
            });

            MultistepComputeShader transferComputeShader =
                new MultistepComputeShader(_computeShaderContainer.HeightTransferShaderPlain, textureSize);
            var textureToBufferKernel = transferComputeShader.AddKernel("CSHeightTransform_InputTextureToBuffer");
            var bufferToTextureKernel = transferComputeShader.AddKernel("CSHeightTransform_BufferToOutputTexture");

            transferComputeShader.SetGlobalUniform("g_sideLength", textureSize.X);

            var transferInputHeightTexture = parametersContainer.AddExistingComputeShaderTexture(texture.Texture);

            transferComputeShader.SetTexture("InputHeightTexture", transferInputHeightTexture,
                                             new List <MyKernelHandle>()
            {
                textureToBufferKernel
            });

            transferComputeShader.SetTexture("OutputHeightTexture", outRenderTexture,
                                             new List <MyKernelHandle>()
            {
                bufferToTextureKernel
            });

            transferComputeShader.SetBuffer("HeightBuffer", heightComputeBuffer,
                                            new List <MyKernelHandle>()
            {
                textureToBufferKernel, bufferToTextureKernel
            });
            //////////////////////////////

            //var configuration =
            //    new HydraulicEroderConfiguration()
            //    {
            //        StepCount = 20,
            //        kr_ConstantWaterAddition = 0.000002f,  // 0.0001f,
            //        ks_GroundToSedimentFactor = 1f,
            //        ke_WaterEvaporationFactor = 0.05f,
            //        kc_MaxSedimentationFactor = 0.8f,
            //    };
            var configuration = _configurations[resolution];

            MultistepComputeShader computeShader =
                new MultistepComputeShader(_computeShaderContainer.HydraulicErosionShader, textureSize);
            var kernel_water                 = computeShader.AddKernel("CSHydraulicErosion_Water");
            var kernel_erostion              = computeShader.AddKernel("CSHydraulicErosion_Erosion");
            var kernel_deltaSum              = computeShader.AddKernel("CSHydraulicErosion_DeltaSum");
            var kernel_clearDelta            = computeShader.AddKernel("CSHydraulicErosion_ClearDelta");
            var kernel_evaporation           = computeShader.AddKernel("CSHydraulicErosion_Evaporation");
            var kernel_sedimentationToGround = computeShader.AddKernel("CSHydraulicErosion_SedimentationToGround");

            computeShader.SetGlobalUniform("g_sideLength", textureSize.X);
            computeShader.SetGlobalUniform("g_krParam", configuration.kr_ConstantWaterAddition);
            computeShader.SetGlobalUniform("g_ksParam", configuration.ks_GroundToSedimentFactor);
            computeShader.SetGlobalUniform("g_keParam", configuration.ke_WaterEvaporationFactor);
            computeShader.SetGlobalUniform("g_kcParam", configuration.kc_MaxSedimentationFactor);

            var allKernels =
                new List <MyKernelHandle>()
            {
                kernel_water,
                kernel_erostion,
                kernel_deltaSum,
                kernel_clearDelta,
                kernel_evaporation,
                kernel_sedimentationToGround
            };

            computeShader.SetBuffer("HeightMap", heightComputeBuffer,
                                    new List <MyKernelHandle>()
            {
                kernel_water,
                kernel_erostion,
                kernel_evaporation,
                kernel_sedimentationToGround
            });


            var waterMap = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4,
                Type   = ComputeBufferType.Default
            });

            computeShader.SetBuffer("WaterMap", waterMap,
                                    new List <MyKernelHandle>()
            {
                kernel_water,
                kernel_erostion,
                kernel_deltaSum,
                kernel_evaporation,
            });

            var deltaBuffer = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4 * 2 * 9,
                Type   = ComputeBufferType.Default
            });

            computeShader.SetBuffer("DeltaBuffer", deltaBuffer,
                                    new List <MyKernelHandle>()
            {
                kernel_erostion,
                kernel_deltaSum,
                kernel_clearDelta
            });

            var sedimentMap = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = textureSize.X * textureSize.Y,
                Stride = 4,
                Type   = ComputeBufferType.Default
            });

            computeShader.SetBuffer("SedimentMap", sedimentMap,
                                    new List <MyKernelHandle>()
            {
                kernel_water,
                kernel_erostion,
                kernel_deltaSum,
                kernel_evaporation,
                kernel_sedimentationToGround
            });

            var debugTexture = parametersContainer.AddComputeShaderTextureTemplate(new MyComputeShaderTextureTemplate()
            {
                Depth           = 24,
                EnableReadWrite = true,
                Format          = RenderTextureFormat.ARGB32,
                Size            = textureSize,
                TexWrapMode     = TextureWrapMode.Clamp
            });

            computeShader.SetTexture("DebugTexture", debugTexture,
                                     new List <MyKernelHandle>()
            {
                kernel_water,
                kernel_erostion,
                kernel_deltaSum,
                kernel_clearDelta,
                kernel_evaporation,
                kernel_sedimentationToGround
            });


            var loopedKernels = new List <MyKernelHandle>()
            {
                kernel_water,
                kernel_erostion,
                kernel_deltaSum,
                kernel_clearDelta,
                kernel_evaporation,
            };

            ComputeBufferRequestedOutParameters outParameters = new ComputeBufferRequestedOutParameters(
                new List <MyComputeShaderTextureId>()
            {
                outRenderTexture
            });
            await _shaderExecutorObject.AddOrder(new ComputeShaderOrder()
            {
                ParametersContainer = parametersContainer,
                OutParameters       = outParameters,
                WorkPacks           = new List <ComputeShaderWorkPack>()
                {
                    new ComputeShaderWorkPack()
                    {
                        Shader        = transferComputeShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = new List <MyKernelHandle>()
                                {
                                    textureToBufferKernel
                                }
                            }
                        }
                    },
                    new ComputeShaderWorkPack()
                    {
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = configuration.StepCount,
                                KernelHandles = loopedKernels,
                            },
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = new List <MyKernelHandle>()
                                {
                                    kernel_sedimentationToGround
                                }
                            }
                        },
                        Shader = computeShader
                    },
                    new ComputeShaderWorkPack()
                    {
                        Shader        = transferComputeShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = new List <MyKernelHandle>()
                                {
                                    bufferToTextureKernel
                                }
                            }
                        }
                    },
                }
            });

            return(new TextureWithCoords(sizedTexture: new TextureWithSize()
            {
                Texture = outParameters.RetriveTexture(outRenderTexture),
                Size = texture.TextureSize
            }, coords: texture.Coords));
        }
        public async Task <TextureWithCoords> ApplyFeatureAsync(TextureWithCoords texture,
                                                                TerrainCardinalResolution resolution,
                                                                bool canMultistep)
        {
            //IntVector2 textureSize = texture.TextureSize;

            //var heightComputeBuffer = new ComputeBuffer(textureSize.X * textureSize.Y, 4, ComputeBufferType.Default);
            //var outRenderTexture = new RenderTexture(textureSize.X, textureSize.Y, 24, RenderTextureFormat.ARGB32);
            //outRenderTexture.enableRandomWrite = true;
            //outRenderTexture.Create();

            ////MultistepComputeShader transferComputeShader =
            ////    new MultistepComputeShader(_computeShaderContainer.HeightTransferShader, textureSize, 8);
            ////var textureToBufferKernel = transferComputeShader.AddKernel("CSHeightTransform_InputTextureToBuffer");
            ////var bufferToTextureKernel = transferComputeShader.AddKernel("CSHeightTransform_BufferToOutputTexture");
            ////transferComputeShader.SetGlobalUniform("g_sideLength", textureSize.X);

            //var inputHeightArray = HeightmapUtils.CreateHeightmapArrayFromTexture(texture.Texture as Texture2D);
            //var inExtremes = MyArrayUtils.CalculateExtremes(inputHeightArray.HeightmapAsArray);
            //MyArrayUtils.Normalize(inputHeightArray.HeightmapAsArray, inExtremes);
            //MyArrayUtils.Multiply(inputHeightArray.HeightmapAsArray, 800f);

            ////var transferInputHeightTexture = new MyRenderTexture("InputHeightTexture", texture.Texture);
            ////transferComputeShader.SetTexture(transferInputHeightTexture,
            ////    new List<MyKernelHandle>() {textureToBufferKernel});

            ////var transferOutputHeightTexture = new MyRenderTexture("OutputHeightTexture", outRenderTexture);
            ////transferComputeShader.SetTexture(transferOutputHeightTexture,
            ////    new List<MyKernelHandle>() {bufferToTextureKernel});

            ////var transferHeightBuffer = new MyComputeBuffer("HeightBuffer", heightComputeBuffer);
            ////transferComputeShader.SetBuffer(transferHeightBuffer,
            ////    new List<MyKernelHandle>() {textureToBufferKernel, bufferToTextureKernel});
            ////////////////////////////////


            //MultistepComputeShader computeShader =
            //    new MultistepComputeShader(_computeShaderContainer.MeiErosionShader, textureSize, 8);

            //var kernel_bufferInitialization = computeShader.AddKernel("CSMei_InitializeBuffers");
            //var kernel_waterIncrement = computeShader.AddKernel("CSMei_WaterIncrement");
            //var kernel_flowSimulation = computeShader.AddKernel("CSMei_FlowSimulation");
            //var kernel_velocityCalculation = computeShader.AddKernel("CSMei_VelocityCalculation");
            //var kernel_sedimentCalculation = computeShader.AddKernel("CSMei_SedimentCalculation");
            //var kernel_sedimentTransportation = computeShader.AddKernel("CSMei_SedimentTransportation");
            //var kernel_evaporation = computeShader.AddKernel("CSMei_Evaporation");


            //int StepCount = 50;
            //float A_PipeCrossSection = 0.05f;
            //float ConstantWaterAdding = 1f / 64;
            //float GravityAcceleration = 9.81f;
            //float DeltaT = 1f;
            //float DepositionConstant = 0.0001f * 12;
            //float DissolvingConstant = 0.0001f * 12;
            //float EvaporationConstant = 0.05f * 10;
            //Vector2 GridSize = new Vector2(1, 1);
            //float L_PipeLength = 1;
            //float SedimentCapacityConstant = 150;

            //computeShader.SetGlobalUniform("g_sideLength", textureSize.X);
            //computeShader.SetGlobalUniform("deltaT", DeltaT);
            //computeShader.SetGlobalUniform("constantWaterAdding", ConstantWaterAdding);
            //computeShader.SetGlobalUniform("A_pipeCrossSection", A_PipeCrossSection);
            //computeShader.SetGlobalUniform("l_pipeLength", L_PipeLength);
            //computeShader.SetGlobalUniform("g_GravityAcceleration", GravityAcceleration);
            //computeShader.SetGlobalUniform("ks_DissolvingConstant", DissolvingConstant);
            //computeShader.SetGlobalUniform("kd_DepositionConstant", DepositionConstant);
            //computeShader.SetGlobalUniform("ke_EvaporationConstant", EvaporationConstant);
            //computeShader.SetGlobalUniform("kc_SedimentCapacityConstant", SedimentCapacityConstant);
            //computeShader.SetGlobalUniform("gridSideSize", GridSize.x);

            //var allKernels =
            //    new List<MyKernelHandle>()
            //    {
            //        kernel_waterIncrement,
            //        kernel_flowSimulation,
            //        kernel_velocityCalculation,
            //        kernel_sedimentCalculation,
            //        kernel_sedimentTransportation,
            //        kernel_evaporation,
            //        kernel_bufferInitialization
            //    };

            //var heightMap = new MyComputeBuffer("HeightMap", heightComputeBuffer);
            //heightMap.SetData(inputHeightArray.HeightmapAsArray); //TODODODOD
            //computeShader.SetBuffer(heightMap, allKernels);

            //var waterMap = new MyComputeBuffer("WaterMap", textureSize.X * textureSize.Y, 4);
            //computeShader.SetBuffer(waterMap, allKernels);

            //var waterMap1 = new MyComputeBuffer("WaterMap_1", textureSize.X * textureSize.Y, 4);
            //computeShader.SetBuffer(waterMap1, allKernels);

            //var waterMap2 = new MyComputeBuffer("WaterMap_2", textureSize.X * textureSize.Y, 4);
            //computeShader.SetBuffer(waterMap2, allKernels);

            //var fluxMap = new MyComputeBuffer("FluxMap", textureSize.X * textureSize.Y, 4 * 4);
            //computeShader.SetBuffer(fluxMap, allKernels);

            //var velocityMap = new MyComputeBuffer("VelocityMap", textureSize.X * textureSize.Y, 4 * 2);
            //computeShader.SetBuffer(velocityMap, allKernels);

            //var sedimentMap = new MyComputeBuffer("SedimentMap", textureSize.X * textureSize.Y, 4);
            //computeShader.SetBuffer(sedimentMap, allKernels);

            //var sedimentMap1 = new MyComputeBuffer("SedimentMap_1", textureSize.X * textureSize.Y, 4);
            //computeShader.SetBuffer(sedimentMap1, allKernels);

            //var DebugTexture = new MyRenderTexture("DebugTexture",
            //    new RenderTexture(textureSize.X, textureSize.Y, 24, RenderTextureFormat.ARGB32), true);
            //computeShader.SetTexture(DebugTexture, allKernels);

            //var loopedKernels =
            //    new List<MyKernelHandle>()
            //    {
            //        kernel_waterIncrement,
            //        kernel_flowSimulation,
            //        kernel_velocityCalculation,
            //        kernel_sedimentCalculation,
            //        kernel_sedimentTransportation,
            //        kernel_evaporation,
            //    };

            //await _shaderExecutorObject.DispatchComputeShader(new ComputeShaderOrder()
            //{
            //    WorkPacks = new List<ComputeShaderWorkPack>()
            //    {
            //        //new ComputeShaderWorkPack()
            //        //{
            //        //    Shader    = transferComputeShader,
            //        //    DispatchLoops = new List<ComputeShaderDispatchLoop>()
            //        //    {
            //        //        new ComputeShaderDispatchLoop()
            //        //        {
            //        //            DispatchCount = 1,
            //        //            KernelHandles = new List<MyKernelHandle>() {textureToBufferKernel }
            //        //        }
            //        //    }
            //        //},
            //        new ComputeShaderWorkPack()
            //        {
            //            DispatchLoops = new List<ComputeShaderDispatchLoop>()
            //            {
            //                new ComputeShaderDispatchLoop()
            //                {
            //                    DispatchCount = StepCount,
            //                    KernelHandles = loopedKernels,

            //                }
            //            },
            //            Shader = computeShader
            //        },
            //        //new ComputeShaderWorkPack()
            //        //{
            //        //    Shader    = transferComputeShader,
            //        //    DispatchLoops = new List<ComputeShaderDispatchLoop>()
            //        //    {
            //        //        new ComputeShaderDispatchLoop()
            //        //        {
            //        //            DispatchCount = 1,
            //        //            KernelHandles = new List<MyKernelHandle>() {bufferToTextureKernel}
            //        //        }
            //        //    }
            //        //},
            //    }
            //});

            //var outHeightMap = new float[textureSize.X, textureSize.Y];
            //heightMap.GetData(outHeightMap);

            //MyArrayUtils.Multiply(outHeightMap, 1/800f);
            //MyArrayUtils.DeNormalize(outHeightMap, inExtremes);

            //var outTexture = HeightmapUtils.CreateTextureFromHeightmap(new HeightmapArray(outHeightMap));

            //return new TextureWithCoords(sizedTexture: new TextureWithSize()
            //{
            //    Texture = outTexture,
            //    Size = texture.TextureSize
            //},   coords: texture.Coords);
            throw new NotImplementedException(); //todo
        }