在最初咱们将一起实现如下图水面稳定的成果,不过浏览完本文,也将理解到这一思路的其余用法
本篇默认读者本曾经能读懂根本的glsl语言,语法不再做过多解释,如果有不了解能够翻看之前的文章有具体解说
用shader制作马赛克
这是上帝的杰作:10行代码搞定“热成像”
几款2077格调的shader
如何扭曲图片
如何扭曲图片?办法多种多样,但偏移是其中比拟罕用也极其便宜的形式。比方能够让小骑士左侧身材偏移20%:
void main() { if(st.x>0.5 ){ st.y+=0.2; } vec4 color = texture2D (u_image0, st); gl_FragColor = vec4(color.rgb, 1.0);}
st是一张(0.0)->(1,1)的二维立体,让其中右侧区域的像素点都读取其上方0.2地位处的像素信息,就实现了平移掉过,这种线性的平移咱们在几款2077格调的shader一文中曾经领教,但用它模仿扭曲是有点尴尬胖虎了。所以咱们给他来点非线形的偏移:
#define PI 3.14//圆周率#define E 2.71828//自然对数的底.....float Distribution(float x){ float a = 1.0/(4.0*PI*PI); float b = pow(E,-(x-0.5)*(x-0.5)/0.04); return a*b;}void main() { st.y = mod(st.y+ 10.0*Distribution(st.x),1.0); // mod保障画面间断 vec4 color = texture2D (u_image0, st); gl_FragColor = vec4(color.rgb, 1.0);}
这里咱们在x=0.5处增加了一个正太散布的偏移:
由正太散布的性质能够晓得,越靠近x=0.5偏移量越大,越靠近1和0偏移越小。在一些须要实现非平面镜的场景中,这个shader能够联合鱼眼及其他扭曲一起实现一些鬼魅的成果。
意外的涂鸦成果
如果叠加一个正太方程就能实现扭曲,那么叠加一个稳定方程能够实现怎么的成果?这里简略选取一个正弦波:
void main() { vec2 offset = vec2(0.0); offset.x = sin(st.x * 14.0) * .2; offset.y = sin(st.y * 14.0) * .2; vec4 color = texture2D(u_image0, uv+offset); gl_FragColor = vec4(color.rgb, 1.0);}
这里设置一个偏移量offset,因为须要在画面中呈现间断的波峰和波谷,须要将函数的频率进步,同时咱们不想让offset取值偏移到屏幕之外,所以管制了振幅,该选什么呢?就暂定0.2吧,而后:
克苏鲁来临了。
这是因为此时振幅还是过大,频率快能够在画面中呈现多层次扭曲,振幅小意味着每次的稳定是轻微的。能够做以下调整:
offset.x = sin(st.x * 14.0) * .02;offset.y = sin(st.y * 14.0) * .02;
或者应用一个mix函数来实现:
vec2 coord = mix(st,st+offset, 0.01);vec4 color = texture2D(u_image0, st+offset);
此时呈现的成果就是:
这里管制下振幅就实现了一种常见的2D成果doodle(涂鸦):
这里我封装了一个函数来实现周期性的涂鸦成果,这在effect等动画工具中也是很常见的:
vec2 doodle(vec2 st, float speed, float amount) { .... _Speed = (floor(u_time * 1.040 * _Speed) / _Speed) * _Speed; ... vec2 offset = vec2(0.0); offset.x = sin((st.x * _Amount + _Speed)); offset.y = cos((st.y * _Amount + _Speed)); ...}
其中_Speed是一个阶梯状函数,这是常见的用来实现跨度式变动的函数:
speed管制变动的快慢,amount管制振幅的大小,越大图像越夸大,举荐speed在(1,5)之间,amount则抉择(5,15)
水面稳定成果
最初可能观众老爷也猜到了,其实咱们只有把阶梯函数去掉就可能实现,让speed出现线形变动就能实现本文结尾例子中的稳定成果了。
_Speed = u_time; // 简略粗犷!!!
其实这个稳定成果曾经足够用了,但有一点太过法则了,如果须要晋升的话,咱们还须要再增加一些突变的随机,这部分就留给读者盆友们自行思考了。
至于这个一鱼两吃的成果有什么利用,也留给读者盆友们吧。