Привет, я увлекаюсь программированием шейдеров. Сегодня это мини-футбол, которым я хочу поделиться.
#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)
FadeToBlack
18.03.2022 10:27У Вас мяч неправильный. Разве можно сферу замостить шестиугольниками? Нужен усеченный икосаэдр! А вообще, интересно. Вот мои эксперимент, тоже пробовал как-то.
4eckme Автор
19.03.2022 00:47Мяч может и не праильный, но я бы с вами поспорил. Шар можно представить как две искривленные поверхности круга, потом заполнить их гексагонами и склеить. В моём примере я тоже искажаю координаты деля их на косинус радиуса, и только потом накладываю гексагоны, поэтому они получаются выпуклыми. Для шара просто будет немного другая формула, я думаю.
shovdmi
Такой «код» можно было и 1 строчку написать.
Ах, да, есть же, вроде бы, ограничение на максимальное количество символов в строке.
4eckme Автор
Мои строки помещаются на моем экране без переноса, при том что слева помещается сама игра, при том что я не обладаю огромным монитором с высоким разрешением, так что я думаю, размер строк допустимый.
GeneAYak
в программировании уже давно принят негласный стандарт в 80 или 100 строк кода, и и думать тут ничего не нужно
TerraV
Как вам там в прошлом? Как доживете до 2009 купите биткоин.
80 символов на строку был стандарт во времена мониторов 4:3. Сейчас стандарт скорее 120, хотя я встречал .editorconfig и 180.
GeneAYak
можно язвить сколько угодно, но, в этой же статье нормально код читать невозможно, несмотря на всю широченность современных мониторов
к тому же, в статье код превышает и 120 тоже
TerraV
Ну так и опишите что видите проблему в читаемости кода, желательно такими словами который можно понять и принять. Механическое ограничение на длину строки эту проблему не решает от слова совсем.
vo1d0
так называемый SOLID?