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