/// <summary>
        /// This resolves a multisampled framebuffer to a non-multisampled renderbuffer.
        /// <para>This removes the depth buffer.</para>
        /// </summary>
        /// <param name="multisampledBuffers"></param>
        /// <param name="target"></param>
        public static void ResolveMultisampledBuffers(Framebuffer multisampledBuffers, Framebuffer target)
        {
            multisampledBuffers.Activate(FramebufferTarget.ReadFramebuffer);
            target.Activate(FramebufferTarget.DrawFramebuffer);
            GL.BlitFramebuffer(0, 0, (int)multisampledBuffers.Size.X, (int)multisampledBuffers.Size.Y, 0, 0,
                               (int)target.Size.X, (int)target.Size.Y, ClearBufferMask.ColorBufferBit,
                               BlitFramebufferFilter.Linear);

            target.Activate();
        }
Пример #2
0
        protected override void Drawing(ColorAttachment source, DrawContext context)
        {
            Arguments["_Scene"]        = (TextureBase)source;
            Arguments["_MVP"]          = Mvp;
            Arguments["_ViewportSize"] = context.Window.WindowSize;

            source.ConnectedFramebuffer.CopyTo(tempFramebuffer);
            tempFramebuffer.Activate();

            _shader.Draw(Arguments);
            tempFramebuffer.CopyTo(source.ConnectedFramebuffer);
        }
        protected override void RenderProcess(ref DrawContext context)
        {
            GL.Enable(EnableCap.DepthTest);
            MainFramebuffer.Activate(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            context.Scene.DrawBackground(context);
            context.Scene.DrawMainObjects(context);
            context.Scene.DrawHUD(context);

            GL.Disable(EnableCap.DepthTest);
            _postBuffer.Activate(ClearBufferMask.ColorBufferBit);
            PostProcessUtility.ResolveMultisampledBuffers(MainFramebuffer, _postBuffer);

            _bloom.Draw(_postBuffer["color"], context);
            _vittage.Draw(_postBuffer["color"], context);
            Framebuffer.Screen.Activate(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            PostProcessUtility.FinalizeHDR(_postBuffer["color"], HDRColorCurve.OnlyExposure, .1f);
        }
Пример #4
0
        void init()
        {
            //Shadow map renderpass
            shadowPass = new RenderPass(dev, VkSampleCountFlags.SampleCount1);
            shadowPass.AddAttachment(SHADOWMAP_FORMAT, VkImageLayout.DepthStencilReadOnlyOptimal, SHADOWMAP_NUM_SAMPLES);
            shadowPass.ClearValues.Add(new VkClearValue {
                depthStencil = new VkClearDepthStencilValue(1.0f, 0)
            });

            SubPass subpass0 = new SubPass();

            subpass0.SetDepthReference(0);
            shadowPass.AddSubpass(subpass0);

            shadowPass.AddDependency(Vk.SubpassExternal, 0,
                                     VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.EarlyFragmentTests,
                                     VkAccessFlags.ShaderRead, VkAccessFlags.DepthStencilAttachmentWrite);
            shadowPass.AddDependency(0, Vk.SubpassExternal,
                                     VkPipelineStageFlags.LateFragmentTests, VkPipelineStageFlags.FragmentShader,
                                     VkAccessFlags.DepthStencilAttachmentWrite, VkAccessFlags.ShaderRead);

            descLayoutShadow = new DescriptorSetLayout(dev,
                                                       new VkDescriptorSetLayoutBinding(0, VkShaderStageFlags.Geometry, VkDescriptorType.UniformBuffer),  //matrices
                                                       new VkDescriptorSetLayoutBinding(1, VkShaderStageFlags.Geometry, VkDescriptorType.UniformBuffer)); //lights

            GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault(VkPrimitiveTopology.TriangleList);

            cfg.rasterizationState.cullMode        = VkCullModeFlags.Back;
            cfg.rasterizationState.depthBiasEnable = true;
            cfg.dynamicStates.Add(VkDynamicState.DepthBias);

            cfg.RenderPass = shadowPass;

            cfg.Layout = new PipelineLayout(dev, descLayoutShadow);
            cfg.Layout.AddPushConstants(
                new VkPushConstantRange(VkShaderStageFlags.Vertex, (uint)Marshal.SizeOf <Matrix4x4> ())
                );

            cfg.AddVertexBinding <PbrModel.Vertex> (0);
            cfg.AddVertexAttributes(0, VkFormat.R32g32b32Sfloat);

            cfg.AddShader(VkShaderStageFlags.Vertex, "shaders/shadow.vert.spv");
            cfg.AddShader(VkShaderStageFlags.Geometry, "shaders/shadow.geom.spv");

            shadowPipeline = new GraphicPipeline(cfg);

            //shadow map image
            shadowMap = new Image(dev, SHADOWMAP_FORMAT, VkImageUsageFlags.DepthStencilAttachment | VkImageUsageFlags.Sampled, VkMemoryPropertyFlags.DeviceLocal, SHADOWMAP_SIZE, SHADOWMAP_SIZE,
                                  VkImageType.Image2D, SHADOWMAP_NUM_SAMPLES, VkImageTiling.Optimal, 1, (uint)renderer.lights.Length);
            shadowMap.CreateView(VkImageViewType.ImageView2DArray, VkImageAspectFlags.Depth, shadowMap.CreateInfo.arrayLayers);
            shadowMap.CreateSampler(VkSamplerAddressMode.ClampToBorder);
            shadowMap.Descriptor.imageLayout = VkImageLayout.DepthStencilReadOnlyOptimal;

            fbShadowMap = new Framebuffer(shadowPass, SHADOWMAP_SIZE, SHADOWMAP_SIZE, (uint)renderer.lights.Length);
            fbShadowMap.attachments.Add(shadowMap);
            fbShadowMap.Activate();

            dsShadow = descriptorPool.Allocate(descLayoutShadow);

            DescriptorSetWrites dsWrite = new DescriptorSetWrites(dsShadow, descLayoutShadow);

            dsWrite.Write(dev, renderer.uboMatrices.Descriptor, renderer.uboLights.Descriptor);
        }
Пример #5
0
        /// <inheritdoc/>
        protected override void Drawing(ColorAttachment source, DrawContext context)
        {
            Framebuffer target = Framebuffer.GetCurrentlyActive();

            // Filtering
            _downsampler[0].Activate(true);
            shaders[0].Draw(source, col =>
            {
                col["ThresholdCurve"].SetVector4(_thresholdCurve);
            });

            // Downsampling
            ColorAttachment last = _downsampler[0]["0"];

            for (int i = 1; i < _iterations; i++)
            {
                ColorAttachment downsampleSource = last;
                Framebuffer     downsampleTarget = _downsampler[i];
                downsampleTarget.Activate(true);
                shaders[1].Draw(downsampleSource);

                last = downsampleTarget["0"];
            }

            // Upsampling
            for (int i = _iterations - 2; i >= 0; i--)
            {
                ColorAttachment downsampleSource = _downsampler[i]["0"];
                Framebuffer     upsampleTarget   = _upsample[i];

                upsampleTarget.Activate(true);

                shaders[2].Draw(last, (a) =>
                {
                    if (last != null)
                    {
                        a["baseBuffer"].SetTexture(downsampleSource);
                    }
                    a["sampleSize"].SetFloat(_sampleSize);
                });

                last = upsampleTarget["0"];
            }

            // combine
            target.Activate(true);
            shaders[3].Draw(last, (a) =>
            {
                a["sampleSize"].SetFloat(_sampleSize);

                a["scene"].SetTexture(_downsampler[0]["1"]);
                a["bloomColor"].SetColor(_bloomColor);

                if (AmountMap != null)
                {
                    a["amountTransform"].SetMatrix3(AmountMapTransform.GetMatrix());
                    a["amountMap"].SetTexture(AmountMap, a["hasAmountMap"]);
                    a["amountLimit"].SetVector2((Vector2)AmountLimits);
                }

                a["HDR"].SetBool(_hdr);
            });
        }