Vulkan Samples 阅读 -- Basics(六): CPU Particle System & Stencil Buffer

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
  • setupDescriptorPool
  • setupDescriptorSet
  • buildCommandBuffers: 两个pass
    • 渲染模型(缩小模型)
    • 只渲染在第一个pass没有渲染的部分,

render

  • draw

shader

- 第一个shader渲染场景
- 第二个shader画边框

小结

   Stencil 的经典用法就是画模型边框. OpenGL教程中有详细的说明.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值