Esempio n. 1
0
        public virtual void Draw(RenderDrawContext drawContext, Shadows.IShadowMapRenderer ShadowMapRenderer)
        {
            if (renderVoxelVolumes == null || renderVoxelVolumes.Count == 0)
            {
                return;
            }

            var context = drawContext;

            using (drawContext.PushRenderTargetsAndRestore())
            {
                // Draw all shadow views generated for the current view
                foreach (var data in renderVoxelVolumeDataList)
                {
                    if (!data.Voxelize)
                    {
                        continue;
                    }

                    RenderView voxelizeRenderView = data.ReprView;

                    //Render Shadow Maps
                    RenderView oldView = drawContext.RenderContext.RenderView;

                    drawContext.RenderContext.RenderView = voxelizeRenderView;
                    ShadowMapRenderer.Draw(drawContext);
                    drawContext.RenderContext.RenderView = oldView;

                    VoxelStorageContext storageContext = data.StorageContext;
                    //Render/Collect voxel fragments
                    using (drawContext.QueryManager.BeginProfile(Color.Black, FragmentVoxelizationProfilingKey))
                    {
                        data.VoxelizationMethod.Render(storageContext, data.Storage, context);
                    }

                    //Fill and write to voxel volume
                    using (drawContext.QueryManager.BeginProfile(Color.Black, ArrangementVoxelizationProfilingKey))
                    {
                        data.Storage.PostProcess(storageContext, context, data);
                    }

                    //Mipmap
                    using (drawContext.QueryManager.BeginProfile(Color.Black, MipmappingVoxelizationProfilingKey))
                    {
                        foreach (var attr in data.Attributes)
                        {
                            attr.PostProcess(context);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        public virtual void Draw(RenderDrawContext drawContext, Shadows.IShadowMapRenderer ShadowMapRenderer)
        {
            if (renderVoxelVolumes == null || renderVoxelVolumes.Count == 0)
            {
                return;
            }

            if (drawContext.GraphicsDevice.Features.CurrentProfile < GraphicsProfile.Level_11_0)
            {
                return;
            }

            var context = drawContext;

            using (drawContext.PushRenderTargetsAndRestore())
            {
                // Draw all shadow views generated for the current view
                foreach (var processedVolumeKeyValue in renderVoxelVolumeData)
                {
                    var processedVolume = processedVolumeKeyValue.Value;
                    if (!processedVolume.Voxelize)
                    {
                        continue;
                    }

                    VoxelStorageContext storageContext = processedVolume.StorageContext;

                    using (drawContext.QueryManager.BeginProfile(Color.Black, PassesVoxelizationProfilingKey))
                    {
                        foreach (VoxelizationPass pass in processedVolume.passList.passes)
                        {
                            RenderView voxelizeRenderView = pass.view;

                            if (pass.requireShadows)
                            {
                                //Render Shadow Maps
                                RenderView oldView = drawContext.RenderContext.RenderView;

                                drawContext.RenderContext.RenderView = voxelizeRenderView;
                                ShadowMapRenderer.Draw(drawContext);
                                drawContext.RenderContext.RenderView = oldView;
                            }

                            //Render/Collect voxel fragments
                            using (drawContext.QueryManager.BeginProfile(Color.Black, FragmentVoxelizationProfilingKey))
                            {
                                using (drawContext.PushRenderTargetsAndRestore())
                                {
                                    pass.method.Render(storageContext, context, pass.view);
                                }
                            }
                        }
                        foreach (VoxelizationPass pass in processedVolume.passList.passes)
                        {
                            pass.method.Reset();
                        }
                    }

                    //Fill and write to voxel volume
                    using (drawContext.QueryManager.BeginProfile(Color.Black, BufferProcessingVoxelizationProfilingKey))
                    {
                        processedVolume.Storage.PostProcess(storageContext, context, processedVolume);
                    }

                    //Mipmap
                    using (drawContext.QueryManager.BeginProfile(Color.Black, MipmappingVoxelizationProfilingKey))
                    {
                        foreach (var attr in processedVolume.Attributes)
                        {
                            if (attr.Output)
                            {
                                attr.Attribute.PostProcess(context);
                            }
                        }
                    }
                }
            }
        }