public void Render(MyCullQuery cullQuery, IGeometrySrvStrategy srvStrategy) { ProfilerShort.Begin("Preculling"); InitFrustumCullPasses(cullQuery, m_tmpCullPasses); ProfilerShort.BeginNextBlock("Culling"); DispatchCullPasses(m_tmpCullPasses, m_tmpVisibleInstances); ProfilerShort.BeginNextBlock("Send output messages"); SendOutputMessages(m_tmpVisibleInstances); ProfilerShort.BeginNextBlock("Prerender"); InitRenderPasses(cullQuery, m_tmpRenderPasses); ProfilerShort.BeginNextBlock("Update LOD selection"); if (IsLodUpdateEnabled) { MyManagers.Instances.UpdateLods(m_tmpRenderPasses, m_tmpVisibleInstances); } ProfilerShort.BeginNextBlock("Rendering"); Draw(m_tmpRenderPasses, m_tmpVisibleInstances, srvStrategy); ProfilerShort.BeginNextBlock("Clearing"); ClearRenderPasses(m_tmpRenderPasses); ProfilerShort.End(); }
void InitFrustumCullPasses(MyCullQuery cullQuery, MyCpuFrustumCullPasses cullPasses) { cullPasses.Clear(); for (int i = 0; i < cullQuery.Size; i++) { MyRenderingPass renderingPass = cullQuery.RenderingPasses[i]; MyFrustumCullQuery frustumCullQuery = cullQuery.FrustumCullQueries[i]; if (renderingPass is VRageRender.MyGBufferPass) { MyCpuFrustumCullPass cpuFrustumCullPass = cullPasses.Allocate(); cpuFrustumCullPass.Frustum = frustumCullQuery.Frustum; cpuFrustumCullPass.IsInsideList.Clear(); cpuFrustumCullPass.List.Clear(); cpuFrustumCullPass.PassId = GetPassId((VRageRender.MyGBufferPass)renderingPass); } if (renderingPass is VRageRender.MyDepthPass) { MyCpuFrustumCullPass cpuFrustumCullPass = cullPasses.Allocate(); cpuFrustumCullPass.Frustum = frustumCullQuery.Frustum; cpuFrustumCullPass.IsInsideList.Clear(); cpuFrustumCullPass.List.Clear(); cpuFrustumCullPass.PassId = GetPassId((VRageRender.MyDepthPass)renderingPass); } } }
void InitRenderPasses(MyCullQuery cullQuery, List <MyRenderPass> renderPasses) { renderPasses.Clear(); foreach (var query in cullQuery.RenderingPasses) { if (query == null) { continue; } Matrix matrix = query.ViewProjection; MyViewport viewport = query.Viewport; if (query is VRageRender.MyGBufferPass) { VRageRender.MyGBufferPass oldGBufferPass = (VRageRender.MyGBufferPass)query; MyGBuffer gbuffer = oldGBufferPass.GBuffer; MyGBufferPass gbufferPass; int passId = GetPassId(oldGBufferPass); m_gbufferPassesPool.AllocateOrCreate(out gbufferPass); gbufferPass.Init(passId, matrix, viewport, gbuffer); renderPasses.Add(gbufferPass); } if (query is VRageRender.MyDepthPass) { VRageRender.MyDepthPass oldDepthPass = (VRageRender.MyDepthPass)query; IDsvBindable dsv = oldDepthPass.Dsv; MyDepthPass depthPass; bool isCascade = oldDepthPass.IsCascade; int passId = GetPassId(oldDepthPass); m_depthPassesPool.AllocateOrCreate(out depthPass); depthPass.Init(passId, matrix, viewport, dsv, isCascade, oldDepthPass.DebugName); renderPasses.Add(depthPass); } } }