转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603

研究了一个雪花飘落效果。感觉挺不错的。分享给大家,效果例如以下:

代码例如以下:

Shader "shadertoy/Flakes" {  // https://www.shadertoy.com/view/4d2XzcProperties{iMouse ("Mouse Pos", Vector) = (100,100,0,0)iChannel0("iChannel0", 2D) = "white" {}  iChannelResolution0 ("iChannelResolution0", Vector) = (100,100,0,0)}CGINCLUDE    #include "UnityCG.cginc"   #pragma target 3.0      #pragma glsl#define vec2 float2#define vec3 float3#define vec4 float4#define mat2 float2x2#define iGlobalTime _Time.y#define mod fmod#define mix lerp#define atan atan2#define fract frac #define texture2D tex2D// 屏幕的尺寸#define iResolution _ScreenParams// 屏幕中的坐标。以pixel为单位#define gl_FragCoord ((_iParam.srcPos.xy/_iParam.srcPos.w)*_ScreenParams.xy) #define PI2 6.28318530718#define pi 3.14159265358979#define halfpi (pi * 0.5)#define oneoverpi (1.0 / pi)fixed4 iMouse;sampler2D iChannel0;fixed4 iChannelResolution0;struct v2f {    float4 pos : SV_POSITION;    float4 srcPos : TEXCOORD0;   };              //   precision highp float;v2f vert(appdata_base v){  v2f o;o.pos = mul (UNITY_MATRIX_MVP, v.vertex);o.srcPos = ComputeScreenPos(o.pos);  return o;    }  vec4 main(v2f _iParam);fixed4 frag(v2f _iParam) : COLOR0 {  return main(_iParam);}  vec4 main(v2f _iParam) {vec2 p = gl_FragCoord.xy/iResolution.xy;vec3  col = vec3(0,0,0);float dd = 150;for( int i=0; i<dd; i++ ){float an = 6.2831*float(i)/dd;vec2  of = vec2( cos(an), sin(an) ) * (1.0+0.6*cos(7.0*an+iGlobalTime)) + vec2( 0.0, iGlobalTime );col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );col = max( col, texture2D( iChannel0, p +  5.0*of/iResolution.xy ).xyz );}col = pow( col, vec3(1.0,2.0,3.0) ) * pow( 4.0*p.y*(1.0-p.y), 0.2);return vec4( col, 1.0 );}ENDCG    SubShader {    Pass {    CGPROGRAM    #pragma vertex vert    #pragma fragment frag    #pragma fragmentoption ARB_precision_hint_fastest     ENDCG    }    }     FallBack Off
}

代码分析:


1)七边形雪花的绘制算法

详细代码例如以下:
float dd = 150;
for( int i=0; i<dd; i++ )
{float an = 6.2831*float(i)/dd;vec2  of = vec2( cos(an), sin(an) ) * (1.0+0.6*cos(7.0*an+iGlobalTime)) + vec2( 0.0, iGlobalTime );col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );col = max( col, texture2D( iChannel0, p +  5.0*of/iResolution.xy ).xyz );
}

在理解这段代码前。先理解怎么画一个圈,代码例如以下:

float dd = 30;
for( int i=0; i<dd; i++ )
{float an = 6.2831*float(i)/dd;vec2  of = vec2( cos(an), sin(an) );col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );
}

然后再准备一张贴图,图片中间是一个白色像素,周围都是黑色

效果例如以下:

这段代码处于fragment shader中,意味着屏幕上每个点都会进行上述的算法。详细例如以下,遍历贴图中该点周围的点(上面的代码中为距离该点为20单位的圆上的点)。把周围点中最亮的作为该点的颜色。 上面的贴图有点特殊。仅仅有一个点是白色,其余点都是黑色的。那么仅仅有距离该点正好为20单位的点才会变成亮色,其余的点都是黑色。如上图的结果。

一句话总结上面算法的效果:贴图中的每个“相对亮点”的周围都会产生“相对亮的特定图形”,图形的亮度取决于该点的亮度。越亮越明显。效果能够參考文末的图片。

接下来理解这段代码:

float dd = 150;
for( int i=0; i<dd; i++ )
{float an = 6.2831*float(i)/dd;vec2  of = vec2( cos(an), sin(an) ) * (1.0+0.7*cos(7.0*an));col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );
//  col = max( col, texture2D( iChannel0, p +  5.0*of/iResolution.xy ).xyz );
}

输出结果例如以下:

a)  1.0+0.7*cos(7.0*an)的图像例如以下:

b)算法中 of 向量的路径为:

结果就非常清晰了;事实上这里算法和《【OpenGL】Shader实例分析(二)- Heart》中绘制心形的算法非常类似。

最后加上时间就能够实现动画了:

vec2  of = vec2( cos(an), sin(an) ) * (1.0+0.6*cos(7.0*an+iGlobalTime)) + vec2( 0.0, iGlobalTime );

第一个iGlobalTime。用来控制雪花的旋转。第二个iGlobalTime使雪花下落。

2)后期颜色等处理

这里能够理解为一种postEffect处理。详细是例如以下的代码贡献的效果:

col = pow( col, vec3(1.0,2.0,3.0) ) * pow( 4.0*p.y*(1.0-p.y), 0.2);

a)  pow(col, vec3(1.0, 2.0, 3.0)) 这句话使得颜色变成暖色调。

col值的范围为[0,1],对小数继续pow运算,次数越高,该值越小。

比方:0.5的1次方是0.5。 2次方为0.25。 3次方为0.125等。所以这句话的作用非常明显:red成份不变,green变小一些,blue变的更小。达到的效果。使得总体颜色会偏向暖色调。

b)pow(4.0*p.y*(1.0-p.y), 0.2) 使得屏幕上下两边变暗。

最后附上shader中用到的贴图:

经过程序处理后,得到例如以下:

文章完成,欢迎讨论。

【OpenGL】Shader实例分析(七)- 雪花飘落效果相关推荐

  1. android 4实例分析,OpenGL Shader实例分析(4)闪光效果

    本文实例为大家分享了opengl shader实例闪光效果的具体代码,供大家参考,具体内容如下 在游戏中,当战斗结束后,对一些获取的宝贝需要进行闪光处理.这篇文章介绍一个进行闪光处理的shader,运 ...

  2. android+动态光圈效果,OpenGL Shader实例分析(8)彩色光圈效果

    本文实例为大家分享了opengl实现彩色光圈效果的具体代码,供大家参考,具体内容如下 研究了一个彩色光圈效果,感觉挺不错的,分享给大家,效果如下: 代码如下: shader "shadert ...

  3. android雪花飘落效果,【OpenGL】Shader实例分析(七)- 雪花飘落效果

    研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如以下: Shader "shadertoy/Flakes" { // https://www.shader ...

  4. python实现雪花飘落效果_python实现雪花飘落效果实例讲解及源码分享!

    点击蓝字"python教程"关注我们哟! 前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及 ...

  5. java实现物体下落效果_手撸一个物体下落的控件,实现雪花飘落效果

    效果图: 圣诞登录页.gif 参考文章: Android自定义View--从零开始实现雪花飘落效果 感谢原文作者,不仅实现了效果,并且写得非常详细,还做了优化.笔者参考原文作者的源码,做了一点修改,实 ...

  6. java飘落的雪花_[Java教程]实现雪花飘落效果

    [Java教程]实现雪花飘落效果 0 2016-11-02 21:00:17 雪花飘落 body{background:#000;background: url(http://www.wallcoo. ...

  7. Android之雪花飘落效果

    Android之雪花飘落效果 一:效果图 二:实现步骤 1:FallObject 下落物体 封装 2:自定义雪花飘View 3:xml布局 4:activity使用 三:最后 一:效果图 Androi ...

  8. HTML圣诞节代码,圣诞节贺卡源代码,实现圣诞节雪花飘落效果

    HTML圣诞节代码,圣诞节贺卡源代码,实现圣诞节雪花飘落效果 完整代码下载地址:HTML圣诞节代码,圣诞节贺卡源代码,实现圣诞节雪花飘落效果 index.html <!DOCTYPE html& ...

  9. HTML5 小练习2—仿华为官网(实现随机雪花飘落效果)

    文章目录 一.界面展示 二.突出显示效果(当鼠标指向时) 1.广告部分动画 2.商品价格突出显示 3.导航栏文字突出显示 三.项目目录 四.CSS样式代码 1.雪花部分实现 五.页面代码 1.inde ...

  10. 用python画雪花飘落_python实现雪花飘落效果实例讲解

    在学习pygame模块过程中,我们可以通过使用 pygame模块实现很多功能性的东西,但是很多人应该没有利用pygame实现过雪花飘落的效果吧,有时候可能是不知道从何入手或者是没有时间写,接下来我就教 ...

最新文章

  1. Tim Berners-Lee重新分散的新Web SOLID简介
  2. 哪一类功率放大电路效率最高_最简单逆变器电路讲解计算,电工电子动手学技术,电路好案例推荐...
  3. 海思移植opencv+车辆检测
  4. android 学习查阅笔记
  5. Java StringBuilder神话被揭穿
  6. 查询各个科目成绩前三的记录
  7. Django中的日期处理注意事项和自定义时间格式转换
  8. 拿到一台新的Windows电脑,我会做什么?
  9. 设计模式-(9)中介者模式(swift)
  10. 远程登录shell命名sftp_开发好物推荐13强于XShell远程连接FinalSHell
  11. 《学习笔记13》——web前端助手:插件fehelper的使用
  12. 小程序源码:酒桌扑克娱乐喝酒小游戏-多玩法安装简单
  13. docx文档怎么排列图片_腾讯、石墨、金山在线文档简单对比
  14. 考研前辈最后悔的事都有哪些?
  15. 计算机无法正常更新,无法完成更新正在撤销更改请不要关闭你的计算机的解决方法...
  16. css 超出显示省略号
  17. 大数据入门--带你快速了解大数据
  18. 【NLG】(六)文本生成评价指标—— ROUGE原理及代码示例
  19. opengl显示北斗七星源代码
  20. Linux之磁盘管理

热门文章

  1. OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持
  2. Length of Last Word
  3. struts2的s:datetimepicker日期时间标签选择器
  4. 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力
  5. qt初步---Qt实现软件从Windows到Linux跨平台
  6. PCB 周期计算采用 SQL 函数调用.net Dll 标量函数 实现
  7. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
  8. 闭包、作用域链、函数
  9. 【Struts1】--beanutils
  10. String.Format数字格式化参考