Пример #1
0
        private void RunTest2(List <Debug2TerrainSpecification> terrainSpecifications,
                              List <Debug2WeldSpecification> weldSpecifications)
        {
            var dtt = new DebugTerrainTester(ComputeShaderContainer);

            dtt.Start(false, true);

            var terrains = terrainSpecifications.Select(s =>
            {
                var realTerrain = dtt.TerrainShapeDbProxy.Query(new TerrainDescriptionQuery()
                {
                    QueryArea = s.QueryArea,
                    RequestedElementDetails = new List <TerrainDescriptionQueryElementDetail>()
                    {
                        new TerrainDescriptionQueryElementDetail()
                        {
                            Type       = TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY,
                            Resolution = TerrainCardinalResolution.MIN_RESOLUTION
                        }
                    }
                }).Result.GetElementOfType(TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY);
                return(new HeightTextureWithUvBase()
                {
                    Texture = realTerrain.TokenizedElement.DetailElement.Texture,
                    UvBase = realTerrain.UvBase
                });
            }).ToList();


            var weldTexture = new RenderTexture(1024, 1024, 0, RenderTextureFormat.RFloat);

            weldTexture.wrapMode          = TextureWrapMode.Clamp;
            weldTexture.enableRandomWrite = true;
            weldTexture.filterMode        = FilterMode.Point;
            weldTexture.Create();
            var weldTextureManager = new WeldingExecutor(ComputeShaderContainer,
                                                         new UnityThreadComputeShaderExecutorObject(), weldTexture);

            foreach (var weldSpecification in weldSpecifications)
            {
                var side1Specification = terrainSpecifications[weldSpecification.Index1];
                var side2Specification = terrainSpecifications[weldSpecification.Index2];

                WeldTextureDrawingOrder weldingOrder = new WeldTextureDrawingOrder()
                {
                    WeldOnTextureInfo = new WeldOnTextureInfo()
                    {
                        ColumnIndex = weldSpecification.ColumnIndex,
                        WeldRange   = weldSpecification.WeldRange
                    },
                    FirstSideInfo = new WeldTextureDrawingSideInfo()
                    {
                        ConstantCoord          = weldSpecification.Side1ConstantCoord,
                        FullLodSidePixelsRange = weldSpecification.Side1FullLodSidePixelsRange,
                        HeightTexture          = terrains[weldSpecification.Index1].Texture,
                        LodLevel         = side1Specification.LodLevel,
                        SideType         = weldSpecification.Side1SideType,
                        SamplingDistance = weldSpecification.Side1SamplingDistance
                    },
                    SecondSideInfo = new WeldTextureDrawingSideInfo()
                    {
                        ConstantCoord          = weldSpecification.Side2ConstantCoord,
                        FullLodSidePixelsRange = weldSpecification.Side2FullLodSidePixelsRange,
                        HeightTexture          = terrains[weldSpecification.Index2].Texture,
                        LodLevel         = side2Specification.LodLevel,
                        SideType         = weldSpecification.Side2SideType,
                        SamplingDistance = weldSpecification.Side2SamplingDistance
                    },
                };
                weldTextureManager.RenderWeld(weldingOrder).Wait(5000);
            }

            for (int i = 0; i < terrainSpecifications.Count; i++)
            {
                var specification = terrainSpecifications[i];
                var terrain       = terrains[i];

                CreateDebugObject(new DebugObjectSpecification()
                {
                    HeightTexture      = terrain.Texture,
                    HeightmapUv        = terrain.UvBase.ToVector4(),
                    HeightmapLodOffset = specification.LodLevel,
                    StartPos           = specification.QueryArea.DownLeftPoint,
                    MeshResolution     = specification.MeshResolution,
                    LocalScale         = new Vector3(5760 * terrain.UvBase.Width, 2300, 5760 * terrain.UvBase.Height)
                },
                                  weldTexture,
                                  specification.TerrainWeldUvs
                                  );
            }
        }
        public async Task RenderWeld(WeldTextureDrawingOrder order)
        {
            var changedPixelsCount = order.WeldOnTextureInfo.WeldRange.Y - order.WeldOnTextureInfo.WeldRange.X;

            var parametersContainer = new ComputeShaderParametersContainer();

            MultistepComputeShader singleToDuoGrassBillboardShader =
                new MultistepComputeShader(_computeShaderContainer.WeldRenderingShader,
                                           new IntVector2(changedPixelsCount, 1));

            var kernel     = singleToDuoGrassBillboardShader.AddKernel("CSTerrainWelding_Main");
            var allKernels = new List <MyKernelHandle>()
            {
                kernel
            };
            var weldTextureInShader = parametersContainer.AddExistingComputeShaderTexture(_weldTexture);

            singleToDuoGrassBillboardShader.SetTexture("WeldTexture", weldTextureInShader, allKernels);

            var weldTextureChangesInfo         = CalculateWeldTextureChangedPixelsShaderRange(order.WeldOnTextureInfo);
            var weldTextureChangesInfoInShader = parametersContainer.AddComputeBufferTemplate(
                new MyComputeBufferTemplate()
            {
                BufferData = new WeldTexturePixelChangesInfo[]
                {
                    weldTextureChangesInfo
                },
                Count  = 1,
                Stride = System.Runtime.InteropServices.Marshal.SizeOf(typeof(WeldTexturePixelChangesInfo)),
                Type   = ComputeBufferType.Default
            });

            singleToDuoGrassBillboardShader.SetBuffer("WeldTextureChangesInfo", weldTextureChangesInfoInShader,
                                                      allKernels);

            var samplingDistance =
                Mathf.RoundToInt(Mathf.Pow(2, Mathf.Max(order.FirstSideInfo.LodLevel, order.SecondSideInfo.LodLevel)));

            var firstSideChangedPixelsShaderRange = CalculateSideChangedPixelsShaderRange(order.FirstSideInfo,
                                                                                          order.FirstSideInfo.SamplingDistance == 0 ? samplingDistance : order.FirstSideInfo.SamplingDistance);

            var secondSideChangedPixelsShaderRange = CalculateSideChangedPixelsShaderRange(order.SecondSideInfo,
                                                                                           order.SecondSideInfo.SamplingDistance == 0 ? samplingDistance : order.SecondSideInfo.SamplingDistance);
            var terrainSideChangesInfoInShader = parametersContainer.AddComputeBufferTemplate(
                new MyComputeBufferTemplate()
            {
                BufferData = new TerrainSidePixelChangesInfo[]
                {
                    firstSideChangedPixelsShaderRange,
                    secondSideChangedPixelsShaderRange
                },
                Count  = 2,
                Stride = System.Runtime.InteropServices.Marshal.SizeOf(typeof(TerrainSidePixelChangesInfo)),
                Type   = ComputeBufferType.Default
            });

            singleToDuoGrassBillboardShader.SetBuffer("TerrainSideChangesInfos", terrainSideChangesInfoInShader,
                                                      allKernels);

            singleToDuoGrassBillboardShader.SetTexture("FirstHeightTexture",
                                                       parametersContainer.AddExistingComputeShaderTexture(order.FirstSideInfo.HeightTexture.Texture),
                                                       allKernels);
            singleToDuoGrassBillboardShader.SetTexture("SecondHeightTexture",
                                                       parametersContainer.AddExistingComputeShaderTexture(order.SecondSideInfo.HeightTexture.Texture),
                                                       allKernels);


            ComputeBufferRequestedOutParameters outParameters = new ComputeBufferRequestedOutParameters();
            await _shaderExecutorObject.AddOrder(new ComputeShaderOrder()
            {
                ParametersContainer = parametersContainer,
                OutParameters       = outParameters,
                WorkPacks           = new List <ComputeShaderWorkPack>()
                {
                    new ComputeShaderWorkPack()
                    {
                        Shader        = singleToDuoGrassBillboardShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = allKernels
                            }
                        }
                    },
                }
            });
        }
Пример #3
0
        private void RunTest(DebugOneSideSpecification side1Specification, DebugOneSideSpecification side2Specification)
        {
            var dtt = new DebugTerrainTester(ComputeShaderContainer);

            dtt.Start(false, true);

            var ter1 = side1Specification.HeightTextureWithUvBase;

            if (ter1 == null)
            {
                var realTerrain = dtt.TerrainShapeDbProxy.Query(new TerrainDescriptionQuery()
                {
                    QueryArea = side1Specification.QueryArea,
                    RequestedElementDetails = new List <TerrainDescriptionQueryElementDetail>()
                    {
                        new TerrainDescriptionQueryElementDetail()
                        {
                            Type       = TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY,
                            Resolution = TerrainCardinalResolution.MIN_RESOLUTION
                        }
                    }
                }).Result.GetElementOfType(TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY);
                ter1 = new HeightTextureWithUvBase()
                {
                    Texture = realTerrain.TokenizedElement.DetailElement.Texture,
                    UvBase  = realTerrain.UvBase
                };
            }

            var ter2 = side2Specification.HeightTextureWithUvBase;

            if (ter2 == null)
            {
                var realTerrain = dtt.TerrainShapeDbProxy.Query(new TerrainDescriptionQuery()
                {
                    QueryArea = side2Specification.QueryArea,
                    RequestedElementDetails = new List <TerrainDescriptionQueryElementDetail>()
                    {
                        new TerrainDescriptionQueryElementDetail()
                        {
                            Type       = TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY,
                            Resolution = TerrainCardinalResolution.MIN_RESOLUTION
                        }
                    }
                }).Result.GetElementOfType(TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY);
                ter2 = new HeightTextureWithUvBase()
                {
                    Texture = realTerrain.TokenizedElement.DetailElement.Texture,
                    UvBase  = realTerrain.UvBase
                };
            }

            var weldTexture = new RenderTexture(1024, 1024, 0, RenderTextureFormat.RFloat);

            weldTexture.wrapMode          = TextureWrapMode.Clamp;
            weldTexture.enableRandomWrite = true;
            weldTexture.filterMode        = FilterMode.Point;
            weldTexture.Create();
            var weldTextureManager = new WeldingExecutor(ComputeShaderContainer,
                                                         new UnityThreadComputeShaderExecutorObject(), weldTexture);


            WeldTextureDrawingOrder weldingOrder = new WeldTextureDrawingOrder()
            {
                WeldOnTextureInfo = new WeldOnTextureInfo()
                {
                    ColumnIndex = 0,
                    WeldRange   = new IntVector2(0, 240),
                },
                FirstSideInfo = new WeldTextureDrawingSideInfo()
                {
                    ConstantCoord          = side1Specification.ConstantCoord,
                    FullLodSidePixelsRange = side1Specification.FullLodSidePixelsRange,
                    HeightTexture          = ter1.Texture,
                    LodLevel = side1Specification.LodLevel,
                    SideType = side1Specification.SideType,
                },
                SecondSideInfo = new WeldTextureDrawingSideInfo()
                {
                    ConstantCoord          = side2Specification.ConstantCoord,
                    FullLodSidePixelsRange = side2Specification.FullLodSidePixelsRange,
                    HeightTexture          = ter2.Texture,
                    LodLevel = side2Specification.LodLevel,
                    SideType = side2Specification.SideType,
                },
            };

            weldTextureManager.RenderWeld(weldingOrder).Wait(5000);

            CreateDebugObject(new DebugObjectSpecification()
            {
                HeightTexture      = ter1.Texture,
                HeightmapUv        = ter1.UvBase.ToVector4(),
                HeightmapLodOffset = side1Specification.LodLevel,
                StartPos           = side1Specification.QueryArea.DownLeftPoint,
                MeshResolution     = side1Specification.MeshResolution,
                LocalScale         = new Vector3(5760 * ter1.UvBase.Width, 2300, 5760 * ter1.UvBase.Height)
            },
                              weldTexture,
                              side1Specification.TerrainWeldUvs
                              );

            CreateDebugObject(new DebugObjectSpecification()
            {
                HeightTexture      = ter2.Texture,
                HeightmapUv        = ter2.UvBase.ToVector4(),
                HeightmapLodOffset = side2Specification.LodLevel,
                StartPos           = side2Specification.QueryArea.DownLeftPoint,
                MeshResolution     = side2Specification.MeshResolution,
                LocalScale         = new Vector3(5760 * ter2.UvBase.Width, 2300, 5760 * ter2.UvBase.Height)
            },
                              weldTexture,
                              side2Specification.TerrainWeldUvs
                              );
        }