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;
        }
Esempio n. 3
0
        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);
        }