Пример #1
0
        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();
        }
Пример #2
0
        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);
                }
            }
        }