Deferred Shading Basics
prepare
- loadAssets: 加载地板和模型, 及其材质贴图
- prepareOffscreenFramebuffer: 准备Gbuffer
- createAttachment: pos
- createAttachment: normal
- createAttachment: color
- createAttachment: depth
- vkCreateRenderPass
- vkCreateFramebuffer
- vkCreateSampler
- prepareUniformBuffers
- createBuffer: Offscreen vertex 和 Deferred fragment 阶段
- updateUniformBufferOffscreen: MVP
- updateUniformBufferComposition: 灯光
- setupDescriptorSetLayout
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- preparePipelines:
- vkCreateGraphicsPipelines: 最终延迟渲染阶段
- vkCreateGraphicsPipelines: Offscreen pipeline
- VkPipelineColorBlendAttachmentState: 绑定三个需要写入资源的Attachment
- setupDescriptorPool
- vkCreateDescriptorPool
- setupDescriptorSets
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets: 绑定最终延迟渲染阶段资源
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets: 绑定离屏渲染阶段资源
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets: 地板相关资源
- buildCommandBuffers: 正常渲染
- loop
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindDescriptorSets
- vkCmdBindPipeline
- vkCmdDraw
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- loop
- buildDeferredCommandBuffer: gbuffer渲染阶段
- createCommandBuffer
- semaphoreCreateInfo: 创建同步信号
- vkCreateSemaphore
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindPipeline
- vkCmdBindDescriptorSets: Background
- vkCmdBindDescriptorSets: Instanced object
- vkCmdDrawIndexed
- vkCmdEndRenderPass
- vkEndCommandBuffer
render
- draw
- vkQueueSubmit: 提交离屏渲染Gbuffer, 并等待渲染结束
- vkQueueSubmit: 场景渲染
- updateUniformBufferComposition
- updateUniformBufferOffscreen
shader
-
shader中只需要注意离屏渲染阶段写入Attachment的逻辑即可
layout (location = 0) out vec4 outPosition; layout (location = 1) out vec4 outNormal; layout (location = 2) out vec4 outAlbedo;
小结
本节主要讲离屏渲染的基本方法, 重点在于Gbuffer的创建, 以及Gbuffer和场景渲染在draw时的顺序和信号的使用.
Deferred Multi Sampling
prepare
- sampleCount = getMaxUsableSampleCount:获取显卡支持的多重采样个数
- loadAssets: 加载地板和模型, 及其材质贴图
- deferredSetup: 延迟设置
- offscreenframeBuffers = new vks::Framebuffer(vulkanDevice): 创建离线framebuffer
- addAttachment: Color
- addAttachment: Normals
- addAttachment:Albedo
- addAttachment:Depth
- createSampler
- createRenderPass
- prepareOffscreenFramebuffer: 准备Gbuffer
- createAttachment: pos
- createAttachment: normal
- createAttachment: color
- createAttachment: depth
- vkCreateRenderPass
- vkCreateFramebuffer
- vkCreateSampler
- prepareUniformBuffers
- createBuffer: Offscreen vertex 和 Deferred fragment 阶段
- updateUniformBufferOffscreen: MVP
- updateUniformBufferDeferredLights: 灯光
- setupDescriptorSetLayout
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- preparePipelines:
- vkCreateGraphicsPipelines:最终延迟渲染阶段(使用抗锯齿)
- specializationInfo.pData = &specializationDat: 设置抗锯齿采用术
- vkCreateGraphicsPipelines: 最终延迟渲染阶段(不使用抗锯齿)
- vkCreateGraphicsPipelines: Offscreen pipeline
- VkPipelineColorBlendAttachmentState: 绑定三个需要写入资源的Attachment
- 设置多重采样
- multisampleState.rasterizationSamples = sampleCount;
- multisampleState.alphaToCoverageEnable = VK_TRUE;
- vkCreateGraphicsPipelines: Offscreen pipeline Sample Shading
- 设置多重采样
- multisampleState.sampleShadingEnable = VK_TRUE;
- multisampleState.minSampleShading = 0.25f;
- 设置多重采样
- 最后两个pipe应该是先最大采样渲染,然后在最大采用中使用0.25去混合得到最终抗锯齿效果sampler
- vkCreateGraphicsPipelines:最终延迟渲染阶段(使用抗锯齿)
- setupDescriptorPool
- vkCreateDescriptorPool
- setupDescriptorSets
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets: 绑定最终延迟渲染阶段资源
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets: 绑定离屏渲染阶段资源
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets: 地板相关资源
- buildCommandBuffers: 正常渲染
- loop
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindDescriptorSets
- vkCmdBindPipeline
- vkCmdDraw
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- loop
- buildDeferredCommandBuffer: gbuffer渲染阶段
- createCommandBuffer
- semaphoreCreateInfo: 创建同步信号
- vkCreateSemaphore
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindPipeline
- vkCmdBindDescriptorSets: Background
- vkCmdBindDescriptorSets: Instanced object
- vkCmdDrawIndexed
- vkCmdEndRenderPass
- vkEndCommandBuffer
render
- draw: 信号处理需要仔细阅读
// Offscreen rendering
// Wait for swap chain presentation to finish
submitInfo.pWaitSemaphores = &semaphores.presentComplete;
// Signal ready with offscreen semaphore
submitInfo.pSignalSemaphores = &offscreenSemaphore;
// Submit work
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &offScreenCmdBuffer;
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
// Scene rendering
// Wait for offscreen semaphore
submitInfo.pWaitSemaphores = &offscreenSemaphore;
// Signal ready with render complete semaphore
submitInfo.pSignalSemaphores = &semaphores.renderComplete;
// Submit work
submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer];
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
- updateUniformBufferOffscreen
shader
-
shader中需要注意离屏渲染阶段写入Attachment是多重采样的sampler (sampler2DMS )
layout (binding = 1) uniform sampler2DMS samplerPosition; layout (binding = 2) uniform sampler2DMS samplerNormal; layout (binding = 3) uniform sampler2DMS samplerAlbedo;
小结
本节主要讲离屏渲染多重采样抗锯齿方法,主要使用了sampler2DMS,需要充分理解延迟渲染管线,该sampler的设置。其他管线设置与上一节相同。