Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров4.7K

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

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

Теги:
Хабы:
Всего голосов 15: ↑5 и ↓10-5
Комментарии15

Публикации

Истории

Работа

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн