Vulkan Samples 阅读 -- Tessellation Shader(一) Displacement Mapping & Dynamic Terrain Tessellation

Displacement Mapping & Model Tessellation

prepare

  • loadAssets: 加载模型
  • prepareUniformBuffers
    • createBuffer: TS
    • updateUniformBuffers
  • setupDescriptorSetLayout
    • vkCreateDescriptorSetLayout
    • vkCreatePipelineLayout
  • preparePipelines
    • Terrain wireframe pipeline
      • vkCreateGraphicsPipelines:
      • 细分有两个阶段
      • 线框模式需要增加pipeline
        • rasterizationState.polygonMode = VK_POLYGON_MODE_LINE
  • setupDescriptorPool
    • vkCreateDescriptorPool
  • setupDescriptorSet
    • Terrain 和 Skysphere
      • vkAllocateDescriptorSets
      • writeDescriptorSet
      • vkUpdateDescriptorSets
  • buildCommandBuffers
    • loop
      • vkBeginCommandBuffer
      • vkCmdBeginRenderPass
      • vkCmdSetViewport
      • vkCmdSetScissor
      • vkCmdSetLineWidth:设置线宽
      • vkCmdBindDescriptorSets
      • splitScreen
        • vkCmdBindPipeline
        • draw
      • ts
        • vkCmdSetViewport
        • vkCmdBindPipeline
        • draw
      • drawUI
      • vkCmdEndRenderPass
      • vkEndCommandBuffer

render

  • draw
    • prepareFrame
    • vkQueueSubmit
    • submitFrame
  • updateUniformBuffers

shader

  • terrain
    • VS: 正常
    • TS:
      • terrain.tese
        • layout (set = 0, binding = 0)
          • 注意set的使用
        • layout (triangles, fractional_odd_spacing, cw) in;
          • in layout
            • 基元 primitive
              • isolines, triangles, quads
            • 间距 spacing
              • equal_spacing, fractional_even_spacing, fractional_odd_spacing
            • 绕序 winding
              • cw保持应用程序中提供的绕组
              • ccw反转应用程序中提供的绕组
        • gl_TessCoord为局部重心坐标
        • mian的细分方法,其实是根据局部中心坐标计算插值的顶点位置,并将该插值点输出
      • terrain.tesc
        • llayout(vertices=3) out
        • main 进行细分
    • FS: 正常渲染

小结

  细分着色器笔记已在前面小节记录。注意一下细分参数的运用即可.

Dynamic Terrain Tessellation

prepare

  • loadAssets
    • 加载天空盒
    • 加载地形数据
    • 加载高度贴图
      • vkCreateSampler
    • 地形贴图
      • vkCreateSampler
  • generateTerrain
    • 生成地形模型数据
      • createBuffer: staging vbo
      • createBuffer:staging ibo
      • createBuffer:device vbo
      • createBuffer:device ibo
      • createCommandBuffer
      • vkCmdCopyBuffer vbo
      • vkCmdCopyBuffer ibo
      • flushCommandBuffer
      • vkDestroyBuffer: vbo ibo
      • vkFreeMemory:vbo ibo
      • delete[] vertices
      • delete[] indices
  • setupQueryResultBuffer
    • vkCreateBuffer: Results are saved in a host visible buffer
    • vkGetBufferMemoryRequirements
    • vkAllocateMemory
    • vkBindBufferMemory
    • vkCreateQueryPool
  • prepareUniformBuffers
    • createBuffer: TS
    • createBuffer: VS
    • updateUniformBuffers
      • Tessellation 和 vertex shader
  • setupDescriptorSetLayout
    • Terrain
      • vkCreateDescriptorSetLayout
      • vkCreatePipelineLayout
    • Skysphere
      • vkCreateDescriptorSetLayout
      • vkCreatePipelineLayout
  • preparePipelines
    • Terrain wireframe pipeline
      • vkCreateGraphicsPipelines:
      • 细分有两个阶段
      • 线框模式需要增加pipeline
        • rasterizationState.polygonMode = VK_POLYGON_MODE_LINE
    • Skysphere pipeline
      • vkCreateGraphicsPipelines:
  • setupDescriptorPool
    • vkCreateDescriptorPool
  • setupDescriptorSet
    • Terrain 和 Skysphere
      • vkAllocateDescriptorSets
      • writeDescriptorSet
      • vkUpdateDescriptorSets
  • buildCommandBuffers
    • loop
      • vkBeginCommandBuffer
      • vkCmdResetQueryPool:设置查询池
      • vkCmdBeginRenderPass
      • vkCmdSetViewport
      • vkCmdSetScissor
      • vkCmdSetLineWidth:设置线宽
      • Skysphere
        • vkCmdBindPipeline
        • vkCmdBindDescriptorSets
        • draw
      • Tessellated terrain
        • vkCmdBeginQuery
        • vkCmdBindPipeline
        • vkCmdBindDescriptorSets
        • vkCmdBindVertexBuffers
        • vkCmdBindIndexBuffer
        • vkCmdDrawIndexed
        • vkCmdEndQuery
      • drawUI
      • vkCmdEndRenderPass
      • vkEndCommandBuffer

render

  • draw
    • prepareFrame
    • vkQueueSubmit
    • getQueryResults
    • submitFrame
  • updateUniformBuffers

shader

  • 引用:https://blog.csdn.net/qq_19473837/article/details/93389003
  • skysphere: 正常渲染
  • terrain
    • VS: 正常
    • TS:
      • terrain.tese
        • layout (set = 0, binding = 0)
          • 注意set的使用
        • layout(quads, equal_spacing, cw) in
          • in layout
            • 基元 primitive
              • isolines, triangles, quads
            • 间距 spacing
              • equal_spacing, fractional_even_spacing, fractional_odd_spacing
            • 绕序 winding
              • cw保持应用程序中提供的绕组
              • ccw反转应用程序中提供的绕组
        • gl_TessCoord为局部重心坐标
        • mian的细分方法,其实是根据局部中心坐标计算插值的顶点位置,并将该插值点输出
      • terrain.tesc
        • layout (vertices = 4) out
        • main 进行细分, 细分笔记已经在pipelinestatistics小节,这里不赘述
    • FS: 正常渲染

小结

  细分着色器笔记已在前面小节记录。注意一下TS的一些设置参数。并且复习一下QueryPool的使用。本小节主要讲细分的一些优化,dynamic level-of-detail ,per-patch frustum culling。以后可以深度研究一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值