Example #1
0
            private int GetKernelLod(MeshSubdivision meshSubd)
            {
                if (_meshSubdCS == null)
                {
                    return(-1);
                }

                string kernelName = "KernelLod";

                if (meshSubd.SubdInterp == SubdInterp.PnTriangle)
                {
                    kernelName += "PnTriangle";
                }
                else if (meshSubd.SubdInterp == SubdInterp.PhongTessellation)
                {
                    kernelName += "PhongTess";
                }

                if (meshSubd.EnableCulling)
                {
                    kernelName += "Culling";
                }

                return(_meshSubdCS.FindKernel(kernelName));
            }
Example #2
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);
            }
Example #3
0
            private int GetKernelIndirectBatcher(MeshSubdivision meshSubd)
            {
                if (_meshSubdCS == null)
                {
                    return(-1);
                }

                string kernelName = "KernelIndirectBatcher";

                if (meshSubd.EnableCulling)
                {
                    kernelName += "Culling";
                }

                return(_meshSubdCS.FindKernel(kernelName));
            }
Example #4
0
 public static void Unregister(MeshSubdivision comp)
 {
     sComponentList.Remove(comp);
 }
Example #5
0
 public static void Register(MeshSubdivision comp)
 {
     sComponentList.Add(comp);
 }
Example #6
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);
            }