public ShaderSource GetSource(RenderVoxelVolumeData data) { var writermixin = new ShaderMixinSource(); writermixin.Mixins.Add(storage); foreach (var attr in data.AttributeIndirect) { writermixin.AddCompositionToArray("AttributesIndirect", attr); } foreach (var attr in data.AttributeModifiers) { writermixin.AddCompositionToArray("Modifiers", attr); } return(writermixin); }
public void UpdateFromContext(VoxelStorageContext context, RenderVoxelVolumeData data) { VoxelMatrix = context.Matrix; var resolution = context.Resolution(); var maxRes = (double)Math.Max(resolution.X, Math.Max(resolution.Y, resolution.Z)); ClipMapCount = (int)Math.Log(maxRes / Math.Min(maxRes, (double)ClipResolution), 2) + 1; InnerClipMapScale = (float)Math.Pow(2, ClipMapCount - 1); ClipMapResolution = new Vector3(resolution.X, resolution.Y, resolution.Z) / InnerClipMapScale; var viewToTexTrans = Matrix.Translation(0.5f, 0.5f, 0.5f); var viewToTexScale = Matrix.Scaling(0.5f, 0.5f, 0.5f); Matrix BaseVoxelMatrix = VoxelMatrix; BaseVoxelMatrix.Invert(); BaseVoxelMatrix = BaseVoxelMatrix * Matrix.Scaling(2f, 2f, 2f); TextureMatrix = BaseVoxelMatrix * viewToTexScale * viewToTexTrans; InnerTextureMatrix = BaseVoxelMatrix * Matrix.Scaling(InnerClipMapScale) * viewToTexScale * viewToTexTrans; }
public virtual void Collect(RenderContext Context, Shadows.IShadowMapRenderer ShadowMapRenderer) { renderVoxelVolumes = Context.VisibilityGroup.Tags.Get(CurrentRenderVoxelVolumes); if (renderVoxelVolumes == null || renderVoxelVolumes.Count == 0) { return; } List <VoxelVolumeComponent> toRemove = new List <VoxelVolumeComponent>(); foreach (var pair in renderVoxelVolumeData) { bool used = false; foreach (var pair2 in renderVoxelVolumes) { if (pair2.Key == pair.Key) { used = true; } } if (!used) { toRemove.Add(pair.Key); } } foreach (var comp in toRemove) { renderVoxelVolumeDataList.Remove(renderVoxelVolumeData[comp]); renderVoxelVolumeData.Remove(comp); renderVoxelVolumes.Remove(comp); } //Create per-volume textures foreach (var pair in renderVoxelVolumes) { var volume = pair.Value; var bounds = volume.VoxelMatrix.ScaleVector; RenderVoxelVolumeData data; if (!renderVoxelVolumeData.TryGetValue(pair.Key, out data)) { data = new RenderVoxelVolumeData(); renderVoxelVolumeDataList.Add(data); renderVoxelVolumeData.Add(pair.Key, data); } VoxelStorageContext storageContext = new VoxelStorageContext { device = Context.GraphicsDevice, Extents = bounds, VoxelSize = volume.AproxVoxelSize, Matrix = volume.VoxelMatrix }; volume.Storage.UpdateFromContext(storageContext, data); foreach (var attr in volume.Attributes) { attr.PrepareLocalStorage(storageContext, volume.Storage); } volume.Storage.UpdateTempStorage(storageContext); ShaderSourceCollection AttributeIndirect = new ShaderSourceCollection(); ShaderSourceCollection AttributeModifiers = new ShaderSourceCollection(); foreach (var attr in volume.Attributes) { AttributeIndirect.Add(attr.GetShader()); attr.AddAttributes(AttributeModifiers); } if (AttributeModifiers != data.AttributeModifiers) { data.AttributeModifiers = AttributeModifiers; } if (AttributeIndirect != data.AttributeIndirect) { data.AttributeIndirect = AttributeIndirect; } data.VisualizeVoxels = volume.VisualizeVoxels; data.Attributes = volume.Attributes; data.Storage = volume.Storage; data.StorageContext = storageContext; data.VoxelizationMethod = volume.VoxelizationMethod; data.VoxelVisualization = volume.VoxelVisualization; data.Voxelize = volume.Voxelize; data.ReprView = volume.VoxelizationMethod.CollectViews(VoxelStage, volume, storageContext, Context); ShadowMapRenderer?.RenderViewsWithShadows.Add(data.ReprView); } }
public void PostProcess(VoxelStorageContext storageContext, RenderDrawContext drawContext, RenderVoxelVolumeData data) { if (Math.Max(Math.Max(ClipMapResolution.X, ClipMapResolution.Y), ClipMapResolution.Z) < 32) { return; } if (FragmentsBuffer == null) { return; } var context = drawContext.RenderContext; if (ClearBuffer == null) { ClearBuffer = new Xenko.Rendering.ComputeEffect.ComputeEffectShader(context) { ShaderSourceName = "ClearBuffer" }; //BufferToTexture = new Xenko.Rendering.ComputeEffect.ComputeEffectShader(Context) { ShaderSourceName = "BufferToTextureEffect" }; BufferToTextureColumns = new Xenko.Rendering.ComputeEffect.ComputeEffectShader(context) { ShaderSourceName = "BufferToTextureColumnsEffect" }; } var BufferWriter = BufferToTextureColumns; for (int i = 0; i < data.Attributes.Count; i++) { var attr = data.Attributes[i]; attr.UpdateLayout("AttributesIndirect[" + i + "]"); } foreach (var attr in data.Attributes) { attr.ApplyWriteParameters(BufferWriter.Parameters); } if (BufferWriter == BufferToTextureColumns) { BufferWriter.ThreadGroupCounts = new Int3(32, 1, 32); BufferWriter.ThreadNumbers = new Int3((int)ClipMapResolution.X / BufferWriter.ThreadGroupCounts.X, ClipMapCount / BufferWriter.ThreadGroupCounts.Y, (int)ClipMapResolution.Z / BufferWriter.ThreadGroupCounts.Z); } else { BufferWriter.ThreadGroupCounts = new Int3(32, 16, 32); BufferWriter.ThreadNumbers = new Int3((int)ClipMapResolution.X / BufferWriter.ThreadGroupCounts.X, (int)ClipMapResolution.Y * ClipMapCount / BufferWriter.ThreadGroupCounts.Y, (int)ClipMapResolution.Z / BufferWriter.ThreadGroupCounts.Z); } BufferWriter.Parameters.Set(BufferToTextureKeys.VoxelFragments, FragmentsBuffer); BufferWriter.Parameters.Set(BufferToTextureKeys.clipMapResolution, ClipMapResolution); BufferWriter.Parameters.Set(BufferToTextureKeys.storageUints, storageUints); BufferWriter.Parameters.Set(BufferToTextureKeys.AttributesIndirect, data.AttributeIndirect); BufferWriter.Parameters.Set(BufferToTextureKeys.Modifiers, data.AttributeModifiers); ((RendererBase)BufferWriter).Draw(drawContext); drawContext.CommandList.ClearReadWrite(FragmentsBuffer, new Vector4(0)); ClearBuffer.ThreadGroupCounts = new Int3(4096 * storageUints * 2, 1, 1); ClearBuffer.ThreadNumbers = new Int3(FragmentsBuffer.ElementCount / ClearBuffer.ThreadGroupCounts.X, 1 / ClearBuffer.ThreadGroupCounts.Y, 1 / ClearBuffer.ThreadGroupCounts.Z); ClearBuffer.Parameters.Set(ClearBufferKeys.buffer, FragmentsBuffer); ((RendererBase)ClearBuffer).Draw(drawContext); }