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

#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)


  1. shovdmi
    17.03.2022 22:05
    +4

    Такой «код» можно было и 1 строчку написать.

    Ах, да, есть же, вроде бы, ограничение на максимальное количество символов в строке.


    1. 4eckme Автор
      17.03.2022 22:13
      -3

      Мои строки помещаются на моем экране без переноса, при том что слева помещается сама игра, при том что я не обладаю огромным монитором с высоким разрешением, так что я думаю, размер строк допустимый.


      1. GeneAYak
        18.03.2022 10:19

        в программировании уже давно принят негласный стандарт в 80 или 100 строк кода, и и думать тут ничего не нужно


        1. TerraV
          18.03.2022 13:05
          +3

          Как вам там в прошлом? Как доживете до 2009 купите биткоин.

          80 символов на строку был стандарт во времена мониторов 4:3. Сейчас стандарт скорее 120, хотя я встречал .editorconfig и 180.


          1. GeneAYak
            18.03.2022 15:49

            можно язвить сколько угодно, но, в этой же статье нормально код читать невозможно, несмотря на всю широченность современных мониторов

            к тому же, в статье код превышает и 120 тоже


            1. TerraV
              18.03.2022 16:02

              Ну так и опишите что видите проблему в читаемости кода, желательно такими словами который можно понять и принять. Механическое ограничение на длину строки эту проблему не решает от слова совсем.


        1. vo1d0
          20.03.2022 11:54

          так называемый SOLID?


  1. sarmanovcom
    17.03.2022 23:07
    +1

    Сильно


  1. JimyJimy
    18.03.2022 04:38
    +1

    По анимации - это скорее баскетбол

    gif ~5мб


    1. 4eckme Автор
      18.03.2022 05:06

      Тут есть что-то и от баскетбола и от регби и от футбола.


    1. paulstrong
      18.03.2022 09:38
      +1

      похоже на каучуковую бомбу


  1. greenkey
    18.03.2022 09:28
    +1

    Интересно, но нифига не понятно. Вы бы как-то раскрыли тему, как программировать шейдеры.


    1. 4eckme Автор
      18.03.2022 13:14

      Это достаточно простой язык с весьма ограниченным функционалом, его очень просто изучить, главное для программирование шейдеров - это знать математику.


  1. FadeToBlack
    18.03.2022 10:27

    У Вас мяч неправильный. Разве можно сферу замостить шестиугольниками? Нужен усеченный икосаэдр! А вообще, интересно. Вот мои эксперимент, тоже пробовал как-то.


    1. 4eckme Автор
      19.03.2022 00:47

      Мяч может и не праильный, но я бы с вами поспорил. Шар можно представить как две искривленные поверхности круга, потом заполнить их гексагонами и склеить. В моём примере я тоже искажаю координаты деля их на косинус радиуса, и только потом накладываю гексагоны, поэтому они получаются выпуклыми. Для шара просто будет немного другая формула, я думаю.