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); } } } } }
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); } } } } } }