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); }
private void OnDisable() { MeshSubdivisionFeature.Unregister(this); for (int i = 0; i < _buffersList.Length; ++i) { _buffersList[i]?.DestructMesh(); _buffersList[i]?.Release(); } }
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); } }
private void OnEnable() { #if UNITY_EDITOR if (_baseMeshes == null) { _baseMeshes = LoadBaseMeshes((int)MeshType.Max); SetMesh(_meshType); } #endif MeshSubdivisionFeature.Register(this); }
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); }
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); }