Shader de Seta de Skillshot
Então, aqui está um vídeo do shader em ação, mas como ele é feito?
Antes de mais nada, este shader funciona apenas em uma mesh específica.
Seu navegador não suporta a tag de vídeo.Esta mesh consiste em 3 quads com cores específicas (RGB) e um valor de alpha (como visto na primeira imagem), eles têm 1x1 unidades e estão todos posicionados no (0, 0, 0).
O RGB é usado como máscara / splatmap para separar as texturas por quad.
bot *= R;
mid *= G;
top *= B;
final = (bot + mid + top) * _Color;

Certo, os quads estão todos empilhados uns sobre os outros, para movê-los vamos usar o alpha do vértice
v.vertex.z += v.color.a * _Range;

Como o quad de baixo recebeu o valor 0, ele não vai se mover, o de cima é todo 1, então ele vai ser deslocado pelo _Range, e o do meio vai ser esticado, já que apenas 2 vértices vão se mover.
Agora, a variação de espessura é um pouco mais complicada
Seu navegador não suporta a tag de vídeo.Precisamos escalar as pontas enquanto deslocamos metade do valor na direção oposta para que o range fique constante, ao mesmo tempo em que escalamos o meio para que ele não se sobreponha.
// Here we are scaling only the ends
float mask = v.color.r + v.color.b;
mask *= _Thic;
mask += v.color.g; // Adding the middle as 1 so it stays the same
v.vertex.xz *= mask;
// The initial offset
v.vertex.z += v.color.a * _Range;
// Here we are remapping the middle (0~1 to -1~1) so we can scale it using na offset
v.vertex.z -= ((_Thic / 2.0) * v.color.g - 0.5 * v.color.g) * (2 * v.color.a - 1);
v.vertex.z -= ((_Thic / 2.0) - 0.5) * (2 * v.color.a - 1); // pushing the ends so the range stays the same
// Now we are scaling the middle part
float mask2 = v.color.g;
mask2 *= _Thic;
mask2 += v.color.r + v.color.b;
v.vertex.x *= mask2;
o.vertex = UnityObjectToClipPos(v.vertex);
E é isso! Há mais algumas coisas no shader final, como uma máscara de alpha baseada na distância da origem e alguns modos de visualização, e note também que você precisa atualizar os bounds do renderer para que a mesh não sofra culling prematuramente.