Estava assistindo alguns Rocket League e percebeu que havia adesivos e rodas animados.
.
Eu gostaria de implementar algo semelhante aos efeitos na imagem acima.
Como eu escreveria um Unity Shader para fazer o efeito de roda?
Não sei muito sobre Shaders, mas posso editar o Unity Shader padrão para fazer o efeito de animação?
_Time
variável interna que você pode adicionar às coordenadas de textura no shader (vértice) para obter um efeito de rolagem muito barato. O efeito hexagonal também seria bastante direto. Se você editar sua pergunta para destacar apenas um efeito e perguntar "como eu implementaria isso em um sombreador do Unity", provavelmente poderemos ajudá-lo. Certifique-se de especificar se o sombreador precisa responder à iluminação / sombreamento, pois isso afeta a forma como seria gravado.Respostas:
Criarei isso em algumas camadas para que você possa ver como isso acontece.
Comece criando um novo sombreador no Unity, escolhendo
Create --> Shader --> Unlit
no menu Ativos ou no menu de contexto do botão direito do mouse na janela Projeto.No bloco superior, adicionaremos um
_ScrollSpeeds
parâmetro para controlar a rapidez com que a textura se move em cada direção:Isso expõe uma nova propriedade de flutuação de 4 componentes no inspetor de materiais, com o nome amigável "Velocidades de rolagem" (semelhante à adição de uma variável
public
ouSerialized
a umMonoBehaviour
script)Em seguida, usaremos essa variável no shader Vertex para alterar as coordenadas da textura (
o.uv
), adicionando apenas duas linhas ao shader padrão:Coloque isso em um quadrilátero (com uma adorável textura de girafa grátis da Kenney ) e você terá:
Para fazer a textura rolar para fora em um anel, podemos usar uma malha subdividida como uma teia de aranha, com a coordenada uv v aumentando do centro para fora. Mas isso dará alguns artefatos em forma de serra por conta própria. Em vez disso, mostrarei como podemos calcular nossos UVs por fragmento.
Isso é um pouco mais caro, tanto pelas operações trig & length (que são mais caras que a matemática básica) quanto pelo fato de não ser tão eficiente prever e armazenar em cache os dados de textura no hardware ao calcular os cabos de texto por fragmento, em comparação com apenas interpolá-los entre vértices. Mas, para um pequeno efeito especial como esse, não é excessivo.
Isso nos dá algo assim (aqui eu aumentei os parâmetros de ladrilhos no material, para ficar mais claro o que está acontecendo - envolver apenas uma única repetição do ladrilho ao redor do círculo parece distorcido e estranho)
Por fim, para tingir a textura com um gradiente de rolagem, podemos apenas adicionar o gradiente como uma segunda textura e multiplicá-los juntos.
Primeiro, adicionamos o novo parâmetro de textura na parte superior:
E declare-o em nosso bloco CGPROGRAM para que o shader CG possa vê-lo:
Atualize nosso shader de fragmento para usar as duas texturas:
E agora a nossa girafa fica muito trippy:
Com uma seleção um pouco mais artística de texturas e taxas de rolagem, isso pode criar um efeito bastante semelhante ao mostrado na pergunta.
Você pode notar dois pequenos artefatos com a versão que mostrei acima:
Os rostos próximos ao centro do círculo ficam esticados / magros / pontudos e, em seguida, à medida que avançam para o exterior, são esmagados / largos.
Essa distorção ocorre porque temos um número fixo de faces em torno do perímetro, mas a circunferência que elas estão ampliando fica maior à medida que o raio aumenta, enquanto a altura permanece a mesma.
Podemos corrigir isso remapeando o componente vertical da amostra de textura para seguir uma curva logarítmica, para que as repetições da textura fiquem mais afastadas à medida que o raio aumenta e se aproximando mais em direção ao centro. (De fato, isso nos dá uma regressão infinita de girafas cada vez menores ...)
Há uma fileira de um ou dois pixels embaçados ao longo do meio esquerdo do quad.
Isso acontece porque a GPU examina duas coordenadas de amostra de textura adjacentes para descobrir qual filtro usar. Quando as amostras estão próximas, ela mostra que a textura está sendo exibida grande / fechada e mostra o nível mip mais detalhado. Quando as amostras estão distantes, supõe-se que devemos mostrar a textura com um zoom minúsculo ou distante, e amostras de um mipmap menor / mais desfocado para garantir que não obtemos artefatos de aliasing brilhantes.
O problema está aqui, estamos no ponto de contorno das coordenadas polares, de -180 a 180 graus. Então, na verdade, estamos amostrando pontos muito semelhantes em nosso espaço de textura repetitivo, mesmo que suas coordenadas numéricas façam com que pareçam distantes. Portanto, podemos fornecer nossos próprios vetores de gradiente de amostra para corrigir isso.
Aqui está uma versão com estas correções:
fonte
tex2Dgrad
corrige o artefato de filtragem em que o ângulo se move de -pi a + pi (essa é a linha fina de pixels borrados no lado esquerdo). Aqui está o resultado