中秋将至,教你使用shader画月亮,更新中...

最终效果:


shadertoy页面查看效果:moon
说明:
1. 本人也是初学者,所以难免一些地方表达不清,还望多多包涵。
2. 本文并不针对完全的初学者,对一些基础函数不会去深入讲解,例如smoothstep等,初学者跟着学的时候希望能自己多多去查询相关api这些才能明白原理
3.因为工作繁忙,无法一次性写完,但保证中秋之前搞定

准备工作: 本人cocos creator 2.4.3版本
如何创建材质和shader 参考王师傅的帖子画一道彩虹,本文不在累赘

step1: 画星空
思路:对一个黑底上的像素点进行随机,随机1的为星星,随机到0的,则无,然后对这些星星利用时间函数进行透明度的调整。 有了思路咱们就开干吧
首先我们得确定一个黑夜的底颜色,这决定了一个黑夜的整体色调,我从网上找了一张星空图对其的底色进行萃取后,大致的颜色值为0.1,0.15,0.2,那么在像素着色器的main函数里将颜色改成这个,代码如下 :image
我们将得到接近于纯黑色的黑夜。
然后可以往上画星星了, 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代码修改后如下: image
此时我们将会得到如下的一张雪花的图片image 那么雪花图片怎么变成星星呢? 这里的思路是将每个点进行一个幂操作,这样接近0的值会更接近于0,而越接近于1的还会比较接近于1,此时main函数中的颜色加上hash的代码改为
col += pow(hash(v_uv0*10000.),1000.);
我们进行1000次幂后发现已经挺像星空了,效果图如下:image
但我们要明白gpu擅长的是多线处理,却并不擅长计算,1000次的幂是不是太浪费gpu的效率了,我们该如何提高效率呢? 我采用的是利用两个随机的hash幂相乘,具体原因希望小伙伴们自己思考思考,此代码改为了
col += pow(hash(v_uv0*10000.),20.)*pow(hash(v_uv0*11111.),20.),
效果图如下: image
接下来我们就要开始让星光开始闪烁了
未完待续。。。。。。

3赞

大佬可以再加一点点云,会有一种朦胧美,能在shader里画这些复杂实物的这一般是真大佬。

1赞

:upside_down_face:我要差评你,你这明明就是照片![狗头保命]

我写帖子 主要是督促自己学习和表达能力,哈哈,其实我也是初学者,有时间我会加上更多效果。如果你愿意也可以在我基础上改,我会尽快更新完本贴

我现在只会用shader作一些效果,还不会用代码和数学公式画具体的实物比如房子、月亮、人物等等,期待大佬教程更新后学习学习

shader大佬在线凡尔赛

我是真不会画实物。。。顶多拿别人画的实物修修改改组合组合

:joy:凡尔你好,又在跟人比赛了

:joy: :joy: :joy: :joy: :joy:

image 竟然找不到编辑按钮了,难道超过天数的帖子不能重新编辑么, 不过我知道怎么用草稿箱了,所以我还是打算等我全部写完了一块放上来吧~~这个帖子就不继续更新了

本文最终链接 :中秋将至,教你使用shader画月亮,完结(第一次写教程,不足之处多多见谅)