public EPropLocaleBufferManagerInitializedBuffers Initialize(ComputeBuffer ePyramidPerFrameParametersBuffer, ComputeBuffer ePyramidConfigurationBuffer
                                                                     , Texture heightmapArray)
        {
            _scopesUpdateOrdersBuffer = new ComputeBuffer(_configuration.MaxScopeUpdateOrdersInBuffer,
                                                          System.Runtime.InteropServices.Marshal.SizeOf(typeof(GpuSoleUpdateOrder)), ComputeBufferType.Default);

            _ePropLocaleBuffer = new ComputeBuffer(_configuration.LocalesCount,
                                                   System.Runtime.InteropServices.Marshal.SizeOf(typeof(GpuEPropLocale)), ComputeBufferType.Default);

            _localesCopyOrdersBuffer = new ComputeBuffer(_configuration.MaxLocalesToCopyInBuffer,
                                                         System.Runtime.InteropServices.Marshal.SizeOf(typeof(GpuSoleLocaleCopyOrder)), ComputeBufferType.Default);

            _scopesToRecalculateBuffer = new ComputeBuffer(_configuration.MaxScopesToRecalculatePerPass, sizeof(int), ComputeBufferType.Default);

            _ePropIdsBuffer = new ComputeBuffer(_configuration.MaxLocalePointersCount,
                                                System.Runtime.InteropServices.Marshal.SizeOf(typeof(GpuEPropElevationId)), ComputeBufferType.Default);

            GenerateShaderOrderTemplates(ePyramidPerFrameParametersBuffer, ePyramidConfigurationBuffer, heightmapArray);

            _eTerrainComputeShader = ComputeShaderUtils.LoadComputeShader("eterrain_comp");

            return(new EPropLocaleBufferManagerInitializedBuffers()
            {
                EPropIdsBuffer = _ePropIdsBuffer,
                EPropLocaleBuffer = _ePropLocaleBuffer
            });
        }
Exemple #2
0
        private void MoveSliceToBuffer(Texture buffer, Texture cube, int sideLength, int sliceIndex)
        {
            var parametersContainer = new ComputeShaderParametersContainer();

            MultistepComputeShader computeShader =
                new MultistepComputeShader(ComputeShaderUtils.LoadComputeShader("util_moveCubeSlice_comp"), new IntVector3(sideLength, sideLength, 1));

            var kernel     = computeShader.AddKernel("CS_Main");
            var allKernels = new List <MyKernelHandle>()
            {
                kernel
            };

            var bufferTexId = parametersContainer.AddExistingComputeShaderTexture(buffer);
            var cubeTexId   = parametersContainer.AddExistingComputeShaderTexture(cube);

            computeShader.SetGlobalUniform("g_SliceIndex", sliceIndex);
            computeShader.SetTexture("_BufferTexture", bufferTexId, allKernels);
            computeShader.SetTexture("_CubeTexture", cubeTexId, allKernels);

            ComputeBufferRequestedOutParameters outParameters = new ComputeBufferRequestedOutParameters(new List <MyComputeShaderTextureId>()
            {
            }, new List <MyComputeBufferId> {
            });

            _shaderExecutorObject.AddOrder(new ComputeShaderOrder()
            {
                ParametersContainer = parametersContainer,
                OutParameters       = outParameters,
                WorkPacks           = new List <ComputeShaderWorkPack>()
                {
                    new ComputeShaderWorkPack()
                    {
                        Shader        = computeShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = allKernels
                            }
                        }
                    },
                }
            }).Wait();
        }
Exemple #3
0
        private async Task ExecuteDispatch(int sideSize, int dispatchOffset, int slicesPerDispatch, RenderTexture texture, string kernelName)
        {
            var parametersContainer = new ComputeShaderParametersContainer();

            MultistepComputeShader computeShader =
                new MultistepComputeShader(ComputeShaderUtils.LoadComputeShader(_shaderName), new IntVector3(sideSize, sideSize, slicesPerDispatch));

            var kernel     = computeShader.AddKernel(kernelName);
            var allKernels = new List <MyKernelHandle>()
            {
                kernel
            };

            var newTextureId = parametersContainer.AddExistingComputeShaderTexture(texture);

            computeShader.SetGlobalUniform("g_SideSize", sideSize);
            computeShader.SetGlobalUniform("g_SlicesPerDispatch", slicesPerDispatch);
            computeShader.SetGlobalUniform("g_DispatchOffset", dispatchOffset);
            computeShader.SetTexture("_OutTexture3D", newTextureId, allKernels);

            ComputeBufferRequestedOutParameters outParameters = new ComputeBufferRequestedOutParameters(new List <MyComputeShaderTextureId>()
            {
                newTextureId
            }, new List <MyComputeBufferId> {
            });
            await _shaderExecutorObject.AddOrder(new ComputeShaderOrder()
            {
                ParametersContainer = parametersContainer,
                OutParameters       = outParameters,
                WorkPacks           = new List <ComputeShaderWorkPack>()
                {
                    new ComputeShaderWorkPack()
                    {
                        Shader        = computeShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = allKernels
                            }
                        }
                    },
                }
            });
        }
        public async Task <float[]> Generate(Mesh mesh, string outBufferName, int outBufferStrideInFloat, int outBufferCount, Dictionary <string, ComputeBuffer> additionalComputeBuffers = null, bool meshMustbeUniquefied = true)
        {
            // UWAGA. Program shadera uruchamiany po raz dla każdego trójkąta
            if (meshMustbeUniquefied)
            {
                Preconditions.Assert(mesh.vertices.Length == mesh.triangles.Length,
                                     $"Vertices count (${mesh.vertices.Length}) is not equal to triangles array count (${mesh.triangles.Length}). Vertices are most propably shared. Uniquefy them!");
            }

            if (additionalComputeBuffers == null)
            {
                additionalComputeBuffers = new Dictionary <string, ComputeBuffer>();
            }

            var parametersContainer = new ComputeShaderParametersContainer();

            MultistepComputeShader barycentricGeneratorShader =
                new MultistepComputeShader(ComputeShaderUtils.LoadComputeShader(_shaderName), new IntVector2(mesh.triangles.Length / 3, 1));

            var kernel     = barycentricGeneratorShader.AddKernel("CS_Main");
            var allKernels = new List <MyKernelHandle>()
            {
                kernel
            };

            var triangleBufferTemplate = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                BufferData = mesh.triangles,
                Count      = mesh.triangles.Length,
                Stride     = sizeof(int),
                Type       = ComputeBufferType.Default
            });

            barycentricGeneratorShader.SetBuffer("Triangles", triangleBufferTemplate, allKernels);

            var vertexBufferTemplate = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                BufferData = mesh.vertices,
                Count      = mesh.vertices.Length,
                Stride     = sizeof(float) * 3,
                Type       = ComputeBufferType.Default
            });

            barycentricGeneratorShader.SetBuffer("Vertices", vertexBufferTemplate, allKernels);

            var normalsBufferTemplate = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                BufferData = mesh.normals,
                Count      = mesh.normals.Length,
                Stride     = sizeof(float) * 3,
                Type       = ComputeBufferType.Default
            });

            barycentricGeneratorShader.SetBuffer("Normals", normalsBufferTemplate, allKernels);

            var outBarycentricBufferTemplate = parametersContainer.AddComputeBufferTemplate(new MyComputeBufferTemplate()
            {
                Count  = outBufferCount,
                Stride = sizeof(float) * outBufferStrideInFloat,
                Type   = ComputeBufferType.Default
            });

            barycentricGeneratorShader.SetBuffer(outBufferName, outBarycentricBufferTemplate, allKernels);

            foreach (var pair in additionalComputeBuffers)
            {
                var id = parametersContainer.AddExistingComputeBuffer(pair.Value);
                barycentricGeneratorShader.SetBuffer(pair.Key, id, allKernels);
            }

            ComputeBufferRequestedOutParameters outParameters = new ComputeBufferRequestedOutParameters(new List <MyComputeBufferId> {
                outBarycentricBufferTemplate
            });
            await _shaderExecutorObject.AddOrder(new ComputeShaderOrder()
            {
                ParametersContainer = parametersContainer,
                OutParameters       = outParameters,
                WorkPacks           = new List <ComputeShaderWorkPack>()
                {
                    new ComputeShaderWorkPack()
                    {
                        Shader        = barycentricGeneratorShader,
                        DispatchLoops = new List <ComputeShaderDispatchLoop>()
                        {
                            new ComputeShaderDispatchLoop()
                            {
                                DispatchCount = 1,
                                KernelHandles = allKernels
                            }
                        }
                    },
                }
            });

            DebugCheckVariables.Check(outParameters);
            float[] outArray = new float[outBufferStrideInFloat * outBufferCount];
            outParameters.CreatedBuffers[outBarycentricBufferTemplate].GetData(outArray);
            return(outArray);
        }