예제 #1
0
            private void ExecuteKernelIndirectBatcher(CommandBuffer cmd, Camera camera, MeshSubdivision meshSubd)
            {
                int kernel = GetKernelIndirectBatcher(meshSubd);

                if (kernel == -1)
                {
                    return;
                }

                var bufferIndex = MeshSubdivisionFeature.ToBufferIndex(camera.cameraType);
                var buffers     = meshSubd.BuffersList[bufferIndex];

                bool ping = buffers.Ping;
                bool pong = buffers.Pong;

                var argsOffsets = new int[] { ping ? 0 : 1, pong ? 0 : 1, 2, 3 };

                var argsBuffer    = buffers.IndirectArgumentBuffer;
                var inSubdBuffer  = buffers.InSubdivisionBuffer;
                var outSubdBuffer = buffers.OutSubdivisionBuffer;
                var cullBuffer    = buffers.CulledIndexBuffer;

                cmd.SetComputeIntParams(_meshSubdCS, ShaderIDs._ArgsOffsets, argsOffsets);

                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWIndirectArgsBuffer, argsBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWSubdivision0Buffer, inSubdBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWSubdivision1Buffer, outSubdBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWCulledIndexBuffer, cullBuffer);

                cmd.DispatchCompute(_meshSubdCS, kernel, 1, 1, 1);
            }
            public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
            {
                var camera           = renderingData.cameraData.camera;
                var bufferIndex      = MeshSubdivisionFeature.ToBufferIndex(camera.cameraType);
                var meshSubdCompList = MeshSubdivisionFeature.ComponentList;

                var cmd = CommandBufferPool.Get("Render Opaques MeshSubdivision");

                cmd.name = "Render Opaques MeshSubdivision";

                for (int i = 0; i < meshSubdCompList.Count; ++i)
                {
                    var comp    = meshSubdCompList[i];
                    var buffers = comp.BuffersList[bufferIndex];

                    var mat      = comp.transform.localToWorldMatrix;
                    var pass     = _meshSubdMat.FindPass("Lit");
                    var topology = MeshTopology.Triangles;

                    var lodParameters = comp.BuildLodParameters(camera);

                    var vertexBuffer = buffers.VertexBuffer;
                    var indexBuffer  = buffers.IndexBuffer;
                    var subdBuffer   = buffers.InSubdivisionBuffer;
                    var cullBuffer   = buffers.CulledIndexBuffer;
                    var argsBuffer   = buffers.IndirectArgumentBuffer;

                    var argsOffset = comp.EnableCulling ? 48 : 32;

                    var interpPnTriangle    = comp.SubdInterp == SubdInterp.PnTriangle;
                    var interpPhongTess     = comp.SubdInterp == SubdInterp.PhongTessellation;
                    var enableVisualization = comp.MeshShading == MeshShading.Visualization;

                    CoreUtils.SetKeyword(cmd, "_CULLING", comp.EnableCulling);
                    CoreUtils.SetKeyword(cmd, "_VISUALIZATION", enableVisualization);
                    CoreUtils.SetKeyword(cmd, "_PN_TRIANGLE", interpPnTriangle);
                    CoreUtils.SetKeyword(cmd, "_PHONG_TESSELLATION", interpPhongTess);

                    cmd.SetGlobalVector(ShaderIDs._LodParameters, lodParameters);

                    cmd.SetGlobalBuffer(ShaderIDs._VertexBuffer, vertexBuffer);
                    cmd.SetGlobalBuffer(ShaderIDs._IndexBuffer, indexBuffer);
                    cmd.SetGlobalBuffer(ShaderIDs._SubdivisionBuffer, subdBuffer);
                    if (comp.EnableCulling)
                    {
                        cmd.SetGlobalBuffer(ShaderIDs._CulledIndexBuffer, cullBuffer);
                    }

                    cmd.DrawProceduralIndirect(mat, _meshSubdMat, pass, topology, argsBuffer, argsOffset);

                    context.ExecuteCommandBuffer(cmd);
                    cmd.Clear();
                }

                CommandBufferPool.Release(cmd);
            }
예제 #3
0
        private void OnDisable()
        {
            MeshSubdivisionFeature.Unregister(this);

            for (int i = 0; i < _buffersList.Length; ++i)
            {
                _buffersList[i]?.DestructMesh();
                _buffersList[i]?.Release();
            }
        }
예제 #4
0
            public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
            {
                var camera           = renderingData.cameraData.camera;
                var bufferIndex      = MeshSubdivisionFeature.ToBufferIndex(camera.cameraType);
                var meshSubdCompList = MeshSubdivisionFeature.ComponentList;

                for (int i = 0; i < meshSubdCompList.Count; ++i)
                {
                    var comp = meshSubdCompList[i];
                    comp.SwapBuffers(bufferIndex);
                }
            }
예제 #5
0
        private void OnEnable()
        {
#if UNITY_EDITOR
            if (_baseMeshes == null)
            {
                _baseMeshes = LoadBaseMeshes((int)MeshType.Max);
                SetMesh(_meshType);
            }
#endif

            MeshSubdivisionFeature.Register(this);
        }
예제 #6
0
            private void ExecuteKernelLod(CommandBuffer cmd, Camera camera, MeshSubdivision meshSubd)
            {
                int kernel = GetKernelLod(meshSubd);

                if (kernel == -1)
                {
                    return;
                }

                var bufferIndex = MeshSubdivisionFeature.ToBufferIndex(camera.cameraType);
                var buffers     = meshSubd.BuffersList[bufferIndex];

                bool ping = buffers.Ping;
                bool pong = buffers.Pong;

                var argsOffsets    = new int[] { ping ? 0 : 1, pong ? 0 : 1, 2, 3, };
                var lodParameters  = meshSubd.BuildLodParameters(camera);
                var cameraPosition = camera.transform.position;
                var frustumPlanes  = meshSubd.BuildFrustumPlanes(camera);

                var viewProjMatrix      = CalculateViewProjMatrix(camera);
                var objectToWorldMatrix = meshSubd.transform.localToWorldMatrix;

                var vertexBuffer  = buffers.VertexBuffer;
                var indexBuffer   = buffers.IndexBuffer;
                var argsBuffer    = buffers.IndirectArgumentBuffer;
                var inSubdBuffer  = buffers.InSubdivisionBuffer;
                var outSubdBuffer = buffers.OutSubdivisionBuffer;
                var cullBuffer    = buffers.CulledIndexBuffer;

                cmd.SetComputeIntParams(_meshSubdCS, ShaderIDs._ArgsOffsets, argsOffsets);
                cmd.SetComputeVectorParam(_meshSubdCS, ShaderIDs._LodParameters, lodParameters);

                cmd.SetComputeVectorParam(_meshSubdCS, ShaderIDs._WorldSpaceCameraPos, cameraPosition);
                cmd.SetComputeVectorArrayParam(_meshSubdCS, ShaderIDs._FrustumPlanes, frustumPlanes);

                cmd.SetComputeMatrixParam(_meshSubdCS, ShaderIDs._ViewProjMatrix, viewProjMatrix);
                cmd.SetComputeMatrixParam(_meshSubdCS, ShaderIDs._ObjectToWorldMatrix, objectToWorldMatrix);

                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._VertexBuffer, vertexBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._IndexBuffer, indexBuffer);

                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWIndirectArgsBuffer, argsBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWSubdivision0Buffer, inSubdBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWSubdivision1Buffer, outSubdBuffer);
                cmd.SetComputeBufferParam(_meshSubdCS, kernel, ShaderIDs._RWCulledIndexBuffer, cullBuffer);

                cmd.DispatchCompute(_meshSubdCS, kernel, argsBuffer, (uint)argsOffsets[0] * 16);
            }
예제 #7
0
            public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
            {
                var meshSubdList = MeshSubdivisionFeature.ComponentList;

                for (int i = 0; i < meshSubdList.Count; ++i)
                {
                    var meshSubd = meshSubdList[i];
                    var camera   = renderingData.cameraData.camera;

                    var bufferIndex = MeshSubdivisionFeature.ToBufferIndex(camera.cameraType);

                    meshSubd.ReserveBuffers(bufferIndex);
                }

                var cmd = CommandBufferPool.Get("Kernel Lod");

                for (int i = 0; i < meshSubdList.Count; ++i)
                {
                    var meshSubd = meshSubdList[i];
                    var camera   = meshSubd.GetOverriddenCamera(renderingData.cameraData.camera);

                    ExecuteKernelLod(cmd, camera, meshSubd);

                    context.ExecuteCommandBuffer(cmd);
                    cmd.Clear();
                }
                CommandBufferPool.Release(cmd);

                cmd = CommandBufferPool.Get("Kernel IndirectBatcher");

                for (int i = 0; i < meshSubdList.Count; ++i)
                {
                    var meshSubd = meshSubdList[i];
                    var camera   = renderingData.cameraData.camera;

                    ExecuteKernelIndirectBatcher(cmd, camera, meshSubd);

                    context.ExecuteCommandBuffer(cmd);
                    cmd.Clear();
                }
                CommandBufferPool.Release(cmd);
            }