CPU Particle Systems
prepare
- loadAssets:
- 加载烟雾资源
- 加载火焰资源
- 加载地板color和法线
- build sampler: vkCreateSampler
- prepareParticles: 准备粒子系统资源
struct Particle { glm::vec4 pos; glm::vec4 color; float alpha; float size; float rotation; uint32_t type; // Attributes not used in shader glm::vec4 vel; float rotationSpeed; };
- std::vector particleBuffer: 设置粒子数量相同的buffer
- 为每个粒子设置 position, 实用了粒子相关的函数模型, 这里先忽略
- 为每个粒子设置透明度, 应该是设置火焰边缘可以透背景
- createBuffer: 创建buffer (一次)
- prepareUniformBuffers
- updateUniformBuffers
- setupDescriptorSetLayout
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- preparePipelines:
- 需要将粒子资源写入 VkPipelineVertexInputStateCreateInfo 中
- setupDescriptorPool
- setupDescriptorSet
- buildCommandBuffers
render
- draw
- updateUniformBufferLight
- updateParticles: 每次渲染更新粒子位置
- updateUniformBuffers
shader
- 渲染粒子, 类型不同给烟雾或火焰纹理
- 渲染环境, 灯光的设置
小结
cup 粒子系统实现起来很简单. 每次渲染更新粒子的position. 给不同的粒子设置不同类型的纹理, 即可达到效果. 复杂的是如何建立火焰粒子系统的数学模型. 这种方式的火焰粒子系统灯光与实际火焰无关.
Stencil Buffer
prepare
- loadAssets: 加载模型
- prepareUniformBuffers
- updateUniformBuffers
- setupDescriptorSetLayout
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- preparePipelines:
- Toon render and stencil fill pass
- depth信息需要使用关键字 VK_STENCIL_OP_REPLACE
- Outline pass
- depth信息需要使用关键字 VK_STENCIL_OP_REPLACE
- Toon render and stencil fill pass
- setupDescriptorPool
- setupDescriptorSet
- buildCommandBuffers: 两个pass
- 渲染模型(缩小模型)
- 只渲染在第一个pass没有渲染的部分,
render
- draw
shader
- 第一个shader渲染场景
- 第二个shader画边框
小结
Stencil 的经典用法就是画模型边框. OpenGL教程中有详细的说明.