iOS开发-OpenGLES进阶教程3

教程

OpenGLES入门教程1-Tutorial01-GLKit OpenGLES入门教程2-Tutorial02-shader入门 OpenGLES入门教程3-Tutorial03-三维变换 OpenGLES入门教程4-Tutorial04-GLKit进阶 OpenGLES进阶教程1-Tutorial05-地球月亮 OpenGLES进阶教程2-Tutorial06-光线 这次的内容是粒子效果。

效果展示

粒子效果.gif

核心思路

  • 自定义shader着色器 通过glCreateProgram()创建shader。
  • 图形变换 GLKMatrix4MakeLookAt实现模型变换 GLKMatrix4MakePerspective实现透视变换
  • 粒子效果 glDrawArrays的GL_POINTS参数可以用来画粒子 glsl的顶点着色有内建变量gl_PointSize,可以用来设置粒子大小
  • 物理 通过a = f/m算加速度 v = v0 + at 算速度 s = s0 + 0.5 * (v0 + v) * t 算距离

具体细节

  • AGLKPointParticleEffect类 AGLKPointParticleEffect类管理并且绘制所有的粒子。
- (void)addParticleAtPosition:(GLKVector3)aPosition
   velocity:(GLKVector3)aVelocity
   force:(GLKVector3)aForce
   size:(float)aSize
   lifeSpanSeconds:(NSTimeInterval)aSpan
   fadeDurationSeconds:(NSTimeInterval)aDuration;

添加一个粒子的方法,参数包括初始速度、受力、大小、持续时间、渐隐时间,** 注意 ** 粒子会根据生命周期进行复用。 loadShaders 方法是加载shader prepareToDraw方法缓存顶点数据、为顶点着色器的变量赋值

  • AGLKPointParticleShader类 代码注释非常详细
attribute vec3 a_emissionPosition; //位置
attribute vec3 a_emissionVelocity; //速度
attribute vec3 a_emissionForce; //受力
attribute vec2 a_size;  //大小 和 Fade持续时间  size = GLKVector2Make(aSize, aDuration);
attribute vec2 a_emissionAndDeathTimes; //发射时间 和 消失时间

// UNIFORMS
uniform highp mat4      u_mvpMatrix; //变换矩阵
uniform sampler2D       u_samplers2D[1]; //纹理
uniform highp vec3      u_gravity; //重力
uniform highp float     u_elapsedSeconds; //当前时间

// Varyings
varying lowp float      v_particleOpacity; //粒子 不透明度

void main()
{
    highp float elapsedTime = u_elapsedSeconds - a_emissionAndDeathTimes.x; //流逝时间
    
    // 质量假设是1.0 加速度 = 力 (a = f/m)
    // v = v0 + at : v 是当前速度; v0 是初速度;
    //               a 是加速度; t 是时间
    highp vec3 velocity = a_emissionVelocity +
    ((a_emissionForce + u_gravity) * elapsedTime);
    
    // s = s0 + 0.5 * (v0 + v) * t : s 当前位置
    //                              s0 初始位置
    //                              v0 初始速度
    //                              v 当前速度
    //                              t 是时间
    // 运算是对向量运算,相当于分别求出x、y、z的位置,再综合
    highp vec3 untransformedPosition = a_emissionPosition +
    0.5 * (a_emissionVelocity + velocity) * elapsedTime;
    
    //得出点的位置
    gl_Position = u_mvpMatrix * vec4(untransformedPosition, 1.0);
    gl_PointSize = a_size.x / gl_Position.w;    
    
    
    // 消失时间减去当前时间,得到当前的寿命; 除以Fade持续时间,当剩余时间小于Fade时间后,得到一个从1到0变化的值
    // 如果这个值小于0,则取0
    v_particleOpacity = max(0.0, min(1.0,
                                     (a_emissionAndDeathTimes.y - u_elapsedSeconds) /
                                     max(a_size.y, 0.00001)));
}

shader编译流程图

Paste_Image.png

总结

OpenGL ES的学习需要多尝试,同时有规范的代码习惯,还要对功能进行抽象和封装。 附上源码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

BZOJ2216: [Poi2011]Lightning Conductor(DP 决策单调性)

首先把给出的式子移项,我们要求的$P_i = max(a_j + \sqrt{|i - j|}) - a_i$。

16220
来自专栏PPV课数据科学社区

数据挖掘知识脉络与资源整理(十)–箱线图

? ? 箱线图的简介 箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常...

34680
来自专栏懒人开发

(5.5)James Stewart Calculus 5th Edition:The Substitution Rule

注意: 这里 自变量改变,对应范围也会改变 不定积分的上下限,由 [a, b] 变为了 [g(a), g(b)]

11730
来自专栏小樱的经验随笔

回溯算法入门及经典案例剖析(初学者必备宝典)

前言 基于有需必写的原则,并且当前这个目录下的文章数量为0(都是因为我懒QAQ),作为开局第一篇文章,为初学者的入门文章,自然要把该说明的东西说明清楚,于是。。...

46040
来自专栏深度学习那些事儿

pytorch新手需要注意的隐晦操作Tensor,max,gather

先看官方的介绍: 如果input是一个n维的tensor,size为 (x0,x1…,xi−1,xi,xi+1,…,xn−1),dim为i,然后index必须...

1.6K80
来自专栏数据结构与算法

洛谷P4316 绿豆蛙的归宿(期望)

给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。 到达每一个顶点...

10440
来自专栏爱撒谎的男孩

回溯算法

29330
来自专栏数据结构与算法

网络流应用

刷了一天最大流的题,都快刷晕了,, 简单总结几个模型吧。 大部分内容来自学姐的PPT 拆点 一个非常有用的思想 限流 将对点的限制转化为对边的限制 点的合并 ...

42290
来自专栏应兆康的专栏

100个Numpy练习【5】

翻译:YingJoy 网址: https://www.yingjoy.cn/ 来源: https://github.com/rougier/numpy-100...

804120
来自专栏章鱼的慢慢技术路

Go指南练习_循环与函数

24520

扫码关注云+社区

领取腾讯云代金券