1 说在开始

最近模拟了切水果里面的拖尾效果,其可以应用在许多的场景里面,例如,武器的刀光,飞机的尾焰效果等等。我开发的这个Demo是基于OpenGL ES的,开发环境(IDE)使用的Android Studio。如果想让案例使用在其他平台,还需要借鉴本节的算法自己开发,如果是OpenGL或者OpenGL ES的话,直接就可以使用。(当然也需要适当的修改的)。

2 代码位置douysu/person-summary​github.com

3 运行效果运行结果

4 原理部分

需要注意的是,我们不能直接将武器的轨道顶点或者手指滑动的位置直接拿过来使用,是需要去计算三角形带顶点位置的。

算法如下:

- 取上一个顶点的位置,和当前顶点的位置形成一个二维向量V1,然后得到V1的垂直向量V2,三角形带是有宽度width的,根据宽度width得到V2方向上的两个顶点,将得到的顶点存储起来。

当然只有顶点是不够的,还需要一幅纹理图和对应纹理坐标。纹理坐标就很简单了,t的值不是1就是0,而s的值需要切割成不同的段数。

纹理图如下:

纹理坐标如下所示:

当然顶点数据和纹理坐标都是需要动态更新的,然后使用OpenGL ES的纹理就可以画出来了。

5 代码

代码较长,我就简单贴一下存储控制参数的类吧。完整源码在:

* Simple to Introduction

* @Author [憨豆酒 yindou97@163.com]

* @Date [2018-10-18]

* @Description [拖尾参数常量类]

* @version [2.0]

*/

public class StreakDataConstant {

public static Object lock=new Object(); //资源锁

public static float STREAK_WIDTH=0.06f;//条带的宽度

public static int STREAK_MAX_NUMBER=30*2;//拖尾的最大长度(必须是2的倍数)

public static int THREAD_DISAPPEAR_TIME=10;//拖尾的消失时间(手指离开后线程休息时间)

public static float[] LINE_COLOR={1.0f,1.0f,0.0f,1.0f};//拖尾的颜色

public static final float MAX_LIFE_SPAN= 1.5f; //最大生命周期

public static final float LIFE_SPAN_STEP= 0.05f;//生命周期步进

public static int SRC_BLEND= GLES30.GL_SRC_ALPHA;//源混合因子

public static int DST_BLEND= GLES30.GL_ONE;//目标混合因子(得到背景全部颜色)

public static int BLEND_FUNC= GLES30.GL_FUNC_ADD;//混合方式

}

注释中说明的很清楚了就不多介绍了。

顶点着色器部分:

#version 300 es

uniform mat4 uMVPMatrix; //总变换矩阵

uniform float maxLifeSpan;//最大生命期

layout (location = 0) in vec3 aPosition;//顶点位置

in vec2 aTexCoor;//顶点纹理坐标

out vec3 vPosition;//传递给片元着色器顶点位置和周期

out float sjFactor;//用于传递给片元着色器的总衰减因子

out vec2 vTextureCoord;//用于传递给片元着色器的变量

void main()

{

gl_Position = uMVPMatrix * vec4(aPosition.xy,0,1); //根据总变换矩阵计算此次绘制此顶点位置

vPosition=aPosition;//x,y,0,周期

sjFactor=aPosition.z/maxLifeSpan;//计算总衰减因子,并将其传递给片元着色器

vTextureCoord=aTexCoor;//将纹理坐标传给片元着色器

}

总衰减因子=当前生命周期/最大生命周期。当衰减因子达到极限值的时候,对应片元就会消失,这样就实现了根据生命周期衰减的目的了。

片元着色器:

#version 300 es

precision mediump float;

uniform sampler2D sTexture;//纹理内容数据

uniform vec4 lineColor;//纹理内容数据

in vec3 vPosition;//接收x,y,0,周期

in float sjFactor;//接收衰减因子

in vec2 vTextureCoord;//用于传递给片元着色器的变量

out vec4 fragColor;//输出到的片元颜色

void main()

{

vec4 stColor=texture(sTexture, vTextureCoord);//采样出纹理颜色

fragColor=lineColor*sjFactor*stColor.a;//给此片元颜色值(线条颜色*衰减因子*Alpha值)

}

最终片元颜色需要乘以采样出的纹理颜色的Alpha值,因为这里的线条颜色是我自己自定义的,不是从纹理冲采样出的颜色,纹理只提供“形状”,这里需要注意。

0 更新

效果是本人在大二时编写的,代码有可能有不符合规范的地方。可以根据算法自己实现。

shader拖尾_【OpenGL编程】拖尾、刀光、剑光、尾焰效果的开发相关推荐

  1. 【OpenGL编程】拖尾、刀光、剑光、尾焰效果的开发

    重要 为了方便大家共同交流学习,我对项目进行了升级,建议大家去我的GitHub去查看,本文章的算法部分还是可以借鉴的.改动具体如下. 1.添加详细类注释,概括类的功能. 2.修改了部分变量名称. 3. ...

  2. 扫地机器人拖实木地板_云鲸拖扫一体机,自动清洗拖布这个方案解决了这类产品的一个痛点...

    云鲸拖扫一体机,自动清洗拖布这个方案解决了这类产品的一个痛点 2020-01-21 20:00:00 41点赞 37收藏 41评论 前言 市面上的扫地机器人林林总总,但总的来说,同质化已经非常严重了, ...

  3. Unity Shader - GrabPass 实现武器热扭曲拖尾效果

    文章目录 先来看看效果 实现思路 Unity带的TrailRender组件 编写脚本实现 CSharp Shader 参数 注意性能 还可以优化 总结 Project 以前龙之谷喜欢选战士,帅气. 战 ...

  4. Cg教程_可编程实时图形权威指南(扫描清晰版)+部分unity shader 知识

      Cg教程_可编程实时图形权威指南(扫描清晰版) .pdf (34.5 MB, 下载次数: 239) Shader Model(在 3D 图形领域常被简称SM)就是"优化渲染引擎模式&qu ...

  5. 尾调用优化 java_基于Java8函数式编程求一个List的全部子集|尾调用优化解决递归性能问题...

    目录 基于函数式编程求一个List的全部子集 代码来自<Java8 in Action>,思路和其他递归解决方法一致,但不同的地方在concat方法 public static List& ...

  6. 拖链电缆 机器人电缆_选购电缆拖链需要注意哪些要点

    电缆拖链是保护产品.是电缆.油管.气管等配套移动的辅助设施,可解决机械设备工作中移动线缆.油管.气管的磨擦.受损及分布零乱等现象发生.电缆拖链产品的种类繁多,规格齐全:如:微型拖链.轻型拖链.医疗器械 ...

  7. 拖链电缆 机器人电缆_干货!拖链电缆用途及安装注意事项

    拖链电缆主要应用于:工业自动化系统.生产流水线系统.焊机机器人.潜水器.等需要来回移动的场合.为了防止电缆纠缠.磨损.拉脱.挂和散乱,常把电缆放入电缆拖链中. 拖链电缆用途 普通拖链电缆具有弯曲性能. ...

  8. 扫地机器人单扫和双扫_小米扫拖机器人体验:再见了,拖把君

    小米在2016年首次推出了扫地机器人,凭借产品力和性价比,可以说为中国家庭的智能清洁概念普及,立下一功. 不过,近两年因为一直没有推出扫拖一体产品,急得民间高手都开始自己动手给米家扫地机改造拖地功能了 ...

  9. 广义表取表头表尾_数据结构广义表的递归算法

    Hello同学们,又到了美妙的星期三,很开心又和大家见面了.这次我们要来讲一讲关于广义表的那些事儿! 俗语说:"与其临渊羡鱼,不如退而结网." 希望通过今天的学习大家可以有所收获. ...

最新文章

  1. python每个if条件后面都要使用冒号_每一个条件后面都要使用冒号。(2.0分)_学小易找答案...
  2. replace函数对dataframe中的值进行替换(所有数据列中的相同值)
  3. 【HDU 2814 扩展欧拉 a^b ≡ (a mod c)^b mod ϕ(c)+ϕ(c) modc,b=ϕ(c) 】
  4. Qt Creator使用调试助手
  5. Android好评功能,Android应用评分功能的实现
  6. android 修改包名
  7. UITableView 界面小实例
  8. 16F877A和24C02通信汇编语言,PIC16f877A读写24c02程序
  9. Android平台下的ToDoList
  10. 怎样用python控制别人的电脑_python实现远程控制电脑
  11. win10驱动开发——驱动签名
  12. 软件评测师考试(下午考点,要背)
  13. json格式校验(json格式校验器)
  14. 速卖通代运营说:速卖通太难了!2020去做不算晚,但是也绝对不早!
  15. 星淘惠:现在做跨境电商还有优势吗?跨境电商发展怎么样
  16. php毫米级监控,监控镜头毫米数与距离对照表
  17. java飞机大战设计收获_飞机大战编写以及Java的面向对象总结
  18. linux qt编译命令,linux下使用命令模式去编译Qt程序
  19. Markdown输入数学公式
  20. 博图买什么样配置的笔记本_在电脑上安装博途软件电脑运行较为顺畅,笔记本电脑需要怎样的配置?...

热门文章

  1. 利用四位共阳数码管显示小数
  2. Python爬取《明日之子》(腾讯视频)评论和弹幕,看看大家都在吐槽什么
  3. Spark大数据分析案例之平均心率检测[2021]
  4. C语言程序设计授课记录202003
  5. redis 主从、读写 相关
  6. 云巡店php源码,云巡店™〡连锁版正式上线开放注册〡《系统使用手册 1.0》
  7. PT6303加充电电路的一套原理图
  8. python1到100奇数相加_如何使用while语句求1到100的奇数和
  9. 全志A40i移植 RTL8188FTV/RTL8188FU USB-WiFi
  10. 报错:Torch not compiled with CUDA enabled看这一篇就足够了