目录
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
- Terrain wireframe pipeline
- setupDescriptorPool
- vkCreateDescriptorPool
- setupDescriptorSet
- Terrain 和 Skysphere
- vkAllocateDescriptorSets
- writeDescriptorSet
- vkUpdateDescriptorSets
- Terrain 和 Skysphere
- buildCommandBuffers
- loop
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdSetLineWidth:设置线宽
- vkCmdBindDescriptorSets
- splitScreen
- vkCmdBindPipeline
- draw
- ts
- vkCmdSetViewport
- vkCmdBindPipeline
- draw
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- loop
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反转应用程序中提供的绕组
- 基元 primitive
- in layout
- gl_TessCoord为局部重心坐标
- mian的细分方法,其实是根据局部中心坐标计算插值的顶点位置,并将该插值点输出
- layout (set = 0, binding = 0)
- terrain.tesc
- llayout(vertices=3) out
- main 进行细分
- terrain.tese
- 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
- Terrain
- preparePipelines
- Terrain wireframe pipeline
- vkCreateGraphicsPipelines:
- 细分有两个阶段
- 线框模式需要增加pipeline
- rasterizationState.polygonMode = VK_POLYGON_MODE_LINE
- Skysphere pipeline
- vkCreateGraphicsPipelines:
- Terrain wireframe pipeline
- setupDescriptorPool
- vkCreateDescriptorPool
- setupDescriptorSet
- Terrain 和 Skysphere
- vkAllocateDescriptorSets
- writeDescriptorSet
- vkUpdateDescriptorSets
- Terrain 和 Skysphere
- buildCommandBuffers
- loop
- vkBeginCommandBuffer
- vkCmdResetQueryPool:设置查询池
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdSetLineWidth:设置线宽
- Skysphere
- vkCmdBindPipeline
- vkCmdBindDescriptorSets
- draw
- Tessellated terrain
- vkCmdBeginQuery
- vkCmdBindPipeline
- vkCmdBindDescriptorSets
- vkCmdBindVertexBuffers
- vkCmdBindIndexBuffer
- vkCmdDrawIndexed
- vkCmdEndQuery
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- loop
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反转应用程序中提供的绕组
- 基元 primitive
- in layout
- gl_TessCoord为局部重心坐标
- mian的细分方法,其实是根据局部中心坐标计算插值的顶点位置,并将该插值点输出
- layout (set = 0, binding = 0)
- terrain.tesc
- layout (vertices = 4) out
- main 进行细分, 细分笔记已经在pipelinestatistics小节,这里不赘述
- terrain.tese
- FS: 正常渲染
小结
细分着色器笔记已在前面小节记录。注意一下TS的一些设置参数。并且复习一下QueryPool的使用。本小节主要讲细分的一些优化,dynamic level-of-detail ,per-patch frustum culling。以后可以深度研究一下。