Футбольный симулятор в 30 строк кода

от автора

Привет, я увлекаюсь программированием шейдеров. Сегодня это мини-футбол, которым я хочу поделиться.

#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. К сожалению из моего окружения, среди программистов никто не занимается программированием графики, поэтому я хочу привлечь внимание к интересному ремеслу 🙂


ссылка на оригинал статьи https://habr.com/ru/post/656233/