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