了解 OpenGL ES实现自定义编程粒子效果 思路

简介: 本案例旨在于了解OpenGL ES中自定义编程粒子效果的整体实现思路。

本案例旨在于了解OpenGL ES中自定义编程粒子效果的整体实现思路。


从效果图中可以看出,案例实现了4种粒子效果,下面来说说实现的整体流程

image.png


如图所示,大致分为4部分


  • 视图控制器类:实现粒子效果
  • 粒子类:管理并绘制粒子
  • 工具类:封装的着色器工具类
  • 着色器:GLSL自定义的顶点和片元着色器


视图控制器类


在这个类中主要是通过粒子类CCPointParticleEffect创建粒子对象,并实现4种粒子效果,然后系统调用GLKView & GLKViewDelegate代理方法进行绘制和更新


涉及的变量及函数如图所示

image.png


粒子类


这个类主要是管理并绘制所有的粒子,相当于GLKit中的GLKBaseEffect类,

对外提供了三个方法


  • addParticleAtPosition函数:用于添加粒子,每次调用仅添加一个粒子,在视图控制器中创建粒子对象,通过粒子对象来调用该方法创建粒子
    执行流程图如图所示:

image.png


prepareToDraw函数,有以下几步准备工作


  • 加载 & 使用shader
  • 通过Uniform传递数据
  • 更新粒子数据,需要调用工具类中的初始化/更新数据方法,将数据从CPU拷贝至GPU
  • 准备相关数据,需要调用工具类的封装的prepareToDrawWithAttrib方法,打开attribute通道,并设置数据的读取方式
  • 绑定纹理

函数的执行流程图如图所示


image.png

prepareToDraw函数执行流程


其中loadShader函数的流程如下


image.png


  • draw函数:用于绘制粒子,底层需要调用工具类的drawArrayWithMode方法,使用OpenGL ES数组绘制的方式进行绘制


涉及的变量及函数实现如下


image.png

粒子类


工具类


该类主要是将OpenGL ES 的部分操作封装成了自定义的方法,增加了代码的复用性,主要封装了4个方法


  • initWithAttribStride函数:初始化,用于在OpenGL ES 中创建一个VBO(顶点属性数组缓冲区)
  • reinitWithAttribStride函数:更新数据,用于在已有VBO的情况下,更新传入着色器中的数据
  • prepareToDrawWithAttrib函数:准备绘制,用于打开attribute通道 & 设置数据的读取方式
  • drawPreparedArraysWithMode函数:绘制,调用OpenGL ES 的数组绘制方式进行图形的绘制

涉及的变量及函数实现如下

image.png自定义着色器


着色器中的变量及man函数操作如下

image.png


从上面的流程中可以看出,自定义编程实现粒子效果是一件非常繁琐的事,在实际的iOS开发中,并不会这么做,一般都是使用Core Animation中的特殊图层CAEmitterLayer来实现粒子效果,主要是因为苹果对粒子效果的封装已经非常完善了,即使用很少的代码便可实现粒子效果。



相关文章
|
6月前
|
XML 小程序 Java
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
126 0
|
存储 编解码 算法
Opengl ES之LUT滤镜(上)
Opengl ES之连载系列
460 0
|
数据安全/隐私保护 开发者
OpenGL ES 多目标渲染(MRT)
Opengl ES连载系列
323 0
|
数据安全/隐私保护 索引
Opengl ES之纹理数组
Opengl ES连载系列
259 0
|
数据安全/隐私保护
Opengl ES之水印贴图
Opengl ES之连载系列
152 0
|
缓存 C++
Opengl ES之FBO
Opengl ES连载系列
153 0
|
Java 数据安全/隐私保护 Android开发
Opengl ES之矩阵变换(下)
Opengl ES连载系列
132 0
|
Java API 数据安全/隐私保护
Opengl ES之矩阵变换(上)
Opengl ES连载系列
149 0
|
存储
Opengl ES之踩坑记
Opengl ES之连载系列
137 0
|
存储 编解码 算法
Opengl ES之RGB转NV21
Opengl ES连载系列
157 0