Vulkan Samples 阅读 -- Deferred(一): Deferred Shading Basics & Deferred Multi Sampling

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
  • 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
  • setupDescriptorPool
    • vkCreateDescriptorPool
  • setupDescriptorSets
    • vkAllocateDescriptorSets
    • vkUpdateDescriptorSets: 绑定最终延迟渲染阶段资源
    • vkAllocateDescriptorSets
    • vkUpdateDescriptorSets: 绑定离屏渲染阶段资源
    • vkAllocateDescriptorSets
    • vkUpdateDescriptorSets: 地板相关资源
  • buildCommandBuffers: 正常渲染
    • loop
      • vkBeginCommandBuffer
      • vkCmdBeginRenderPass
      • vkCmdSetViewport
      • vkCmdSetScissor
      • vkCmdBindDescriptorSets
      • vkCmdBindPipeline
      • vkCmdDraw
      • drawUI
      • vkCmdEndRenderPass
      • vkEndCommandBuffer
  • 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的设置。其他管线设置与上一节相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值