版权声明:涉猎过的知识都像是不断汇入大海的涓涓细流,你怎么知道是哪条汇入的溪流让海洋成为海洋呢【转载请注明出处】 https://blog.csdn.net/panda1234lee/article/details/52317604
代码参考自inigo quilez老师的Shader Toy
延伸阅读:
iq老师的相关的三篇文章:
效果图
附上我的修改效果图:
GLSL代码:
// Created by inigo quilez - iq/2013
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
uniform float iGlobalTime;
// 随机方法
vec2 hash( vec2 p )
{
p=vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
return fract(sin(p)*18.5453);
}
// return distance, and cell id
vec2 voronoi( in vec2 x )
{
vec2 n = floor( x ); // cell(n)
vec2 f = fract( x ); // 当前像素在cell space的坐标
vec3 m = vec3( 8. ); // 影响每个cell的大小,影响背景颜色
// 遍历相邻的9个cell
for( int j=-1; j<=1; j++ )
{
for( int i=-1; i<=1; i++ )
{
vec2 g = vec2( float(i), float(j) ); // 临近的 cell id offset
// n+g 临近的 cell(n+g) 的随机像素坐标 o (cell space)
vec2 o = hash( n + g ); // 影响cell的颜色
// ❤
vec2 r = g - f + (0.5+0.5*sin(iGlobalTime+6.2831*o));
//vec2 r = g - f + o; // cell(n+g)[o] - cell(n)[f]
// ❤
float d = dot( r, r );
// 保存更小的d
if( d<m.x )
{
m = vec3( d, o );
}
}
}
return vec2( sqrt(m.x), m.y+m.z );
}
void main( )
{
vec2 iResolution = vec2(512., 512.);
vec2 p = gl_FragCoord.xy/max(iResolution.x,iResolution.y);
// computer voronoi patterm
vec2 c = voronoi( (14.0+6.0*sin(0.2*iGlobalTime))*p );
// colorize
vec3 col = 0.5 + 0.5*cos( c.y*6.2831 + vec3(0.0,1.0,2.0) ); // cell的随机颜色
col *= clamp(1.0 - 0.6*c.x*c.x, 0.0, 1.0);
col -= (1.0-smoothstep( 0.05, 0.06, c.x)); // 画Voronoi的site点集
gl_FragColor = vec4( col, 1.0 );
}