Привет, я увлекаюсь программированием шейдеров. Сегодня это мини-футбол, которым я хочу поделиться.
#define W 5
#define rot(a) mat2(cos(a),sin(a),-sin(a),cos(a))
#define m(v2,deg) mod((v2)*rot(radians(deg)),60.0)-30.0
#define hex() o1=m(o,0.);o2=m(o,60.);o3=m(o,120.);rgba+=clamp(vec4(abs(o1.y)+abs(o2.y)+abs(o3.y)-54.),0.1,1.0);
void mainImage(out vec4 rgba,in vec2 o){
rgba=vec4(0.33,1.0,0.5,1);
vec2 R=iResolution.xy,iM=((length(iMouse.z)>=1.0)?vec2(iMouse.x,iMouse.y)*1.0:R/2.0)*min(R.x,R.y)/360.0;
o-=R/2.;vec2 a=o,M=o,field=o;o/=min(R.x,R.y)/360.0;;field/=min(R.x,R.y)/360.0;
vec2 o1,o2,o3;float iT=iTime;
o-=(-iM/min(R.x,R.y)*360.0+R/2.0)/min(R.x,R.y)*360.0*(vec2(sign(cos(iT/3.14))*cos(iT/3.14)*cos(iT/3.14),sin(iT/1.57)));
o/=(abs(cos(radians(iTime*180.0)))+0.5)/1.5;
float scale=7.0,x=o.x/scale,y=o.y/scale,
z=sqrt(x*x+y*y)/scale;o/=cos(z);
//field
ivec4 f=ivec4(int(abs(field.x))/W,int(abs(field.y))/W,int((abs(field.x)-0.499)/float(W)*2.0),int(length(field)/float(W)));
if(((f.x-10*W)*(f.y-5*W)==0||f.x>=8*W&&f.y==2*W||f.x==8*W&&f.y<=2*W||(f.z)==0)&&(f.y<=5*W&&f.x<=10*W)||f.w==2*W)
rgba=vec4(2.0,2.2,2.0,1);
if(z<1.0){//ball
rgba=vec4(0,0,0,1);
o+=vec2(cos(iTime/1.0)*90.0,-sin(iTime/1.0)*90.0);hex();o.y+=40.;hex();
rgba*=(pow(1.0-cos(z),2.0)+3./4.0);
if(rgba.x<=0.5)rgba*=pow(cos(z),-2.0)/2.0;
}else{//grass
rgba*=(cos(length(mod(a,R/10.5))*length(mod(a,R/10.5))*5.0)+2.0)/3.0;
if(-length(M+R/2.-iM/min(R.x,R.y)*360.0)>=-16.*min(R.x,R.y)/360.0){//Player
rgba=clamp(rgba,0.0,1.0)*0.5;
}if(z<2.){//shadow
rgba=clamp(rgba,0.0,1.0)+clamp((z-1.1)/((abs(cos(radians(iTime*180.0)))+0.5)/1.5),-1.0,0.0);
} } }
Если интересны дополнительные комментарии к коду, то "o" - это мяч, "a" - это фрактальный газон, "f" - это разметка поля. Мяч представляет и себя сетку из шестигранников, объем которой придаем с помощью этой строки: z=sqrt(x*x+y*y)/scale;o/=cos(z);
Я часто поражаюсь, как можно сократить объем кода с помощью glsl и shadertoy. К сожалению из моего окружения, среди программистов никто не занимается программированием графики, поэтому я хочу привлечь внимание к интересному ремеслу :)