Exemplo n.º 1
0
        public void DeleteRun()
        {
            PipelineResources  resources  = RenderPipeline.current.resources;
            PipelineBaseBuffer baseBuffer = SceneController.baseBuffer;
            int           result          = baseBuffer.clusterCount - property.clusterCount;
            ComputeShader shader          = resources.shaders.streamingShader;

            if (result > 0)
            {
                NativeArray <int> indirectArgs = new NativeArray <int>(5, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
                indirectArgs[0] = 0;
                indirectArgs[1] = 1;
                indirectArgs[2] = 1;
                indirectArgs[3] = result;
                indirectArgs[4] = propertyCount;
                baseBuffer.moveCountBuffer.SetData(indirectArgs);
                ComputeBuffer indexBuffer = SceneController.GetTempPropertyBuffer(property.clusterCount, 8);
                indirectArgs.Dispose();
                shader.SetBuffer(0, ShaderIDs.instanceCountBuffer, baseBuffer.moveCountBuffer);
                shader.SetBuffer(0, ShaderIDs.clusterBuffer, baseBuffer.clusterBuffer);
                shader.SetBuffer(0, ShaderIDs._IndexBuffer, indexBuffer);
                shader.SetBuffer(1, ShaderIDs._IndexBuffer, indexBuffer);
                shader.SetBuffer(1, ShaderIDs.verticesBuffer, baseBuffer.verticesBuffer);

                ComputeShaderUtility.Dispatch(shader, 0, result);
                shader.DispatchIndirect(1, baseBuffer.moveCountBuffer);
            }
            baseBuffer.clusterCount = result;
            loading = false;
            state   = State.Unloaded;
        }