最终效果:
shadertoy页面查看效果:moon
说明:
1. 本人也是初学者,所以难免一些地方表达不清,还望多多包涵。
2. 本文并不针对完全的初学者,对一些基础函数不会去深入讲解,例如smoothstep等,初学者跟着学的时候希望能自己多多去查询相关api这些才能明白原理
3.因为工作繁忙,无法一次性写完,但保证中秋之前搞定
准备工作: 本人cocos creator 2.4.3版本
如何创建材质和shader 参考王师傅的帖子画一道彩虹,本文不在累赘
step1: 画星空
思路:对一个黑底上的像素点进行随机,随机1的为星星,随机到0的,则无,然后对这些星星利用时间函数进行透明度的调整。 有了思路咱们就开干吧
首先我们得确定一个黑夜的底颜色,这决定了一个黑夜的整体色调,我从网上找了一张星空图对其的底色进行萃取后,大致的颜色值为0.1,0.15,0.2,那么在像素着色器的main函数里将颜色改成这个,代码如下 :
我们将得到接近于纯黑色的黑夜。
然后可以往上画星星了, gpu最难的一部分就在于随机了,随机算法都得亲自实现,首先我这里提供一个hash到0到1的算法
float hash(vec2 p) {
vec3 p3 = fract(vec3(p.xyx) * MOD3);
p3 += dot(p3, p3.yzx + 19.19);
return fract((p3.x + p3.y) * p3.z);
}
这个hash函数会返回一个0到1的伪随机数,此时我们可以在main里面对每个点进行一下hash,main代码修改后如下:
此时我们将会得到如下的一张雪花的图片 那么雪花图片怎么变成星星呢? 这里的思路是将每个点进行一个幂操作,这样接近0的值会更接近于0,而越接近于1的还会比较接近于1,此时main函数中的颜色加上hash的代码改为
col += pow(hash(v_uv0*10000.),1000.);
我们进行1000次幂后发现已经挺像星空了,效果图如下: ,
但我们要明白gpu擅长的是多线处理,却并不擅长计算,1000次的幂是不是太浪费gpu的效率了,我们该如何提高效率呢? 我采用的是利用两个随机的hash幂相乘,具体原因希望小伙伴们自己思考思考,此代码改为了
col += pow(hash(v_uv0*10000.),20.)*pow(hash(v_uv0*11111.),20.),
效果图如下: ,
接下来我们就要开始让星光开始闪烁了
未完待续。。。。。。