Estou estudando a criação de protótipos de um jogo no Unity, que consistirá em sprites quadrados sólidos / ladrilhos. Eu acho que posso representar diferentes tipos de objetos com cores diferentes para cada uma das peças do jogo.
Eu acho que posso importar um único sprite quadrado e sombrear adequadamente no Unity, em vez de quadrados importados de muitas cores diferentes.
Minha experiência com o ajuste de matiz e saturação no Photoshop mostra que o branco não é uma cor fácil de mudar, pois as coisas brancas geralmente permanecem brancas. Meus testes no Unity mostram que eu posso alterar a "cor" de um sprite para algo que não seja branco, e o sprite parece sombreado adequadamente, apesar do que eu pensaria, dada a minha experiência no Photoshop.
Como os objetos brancos parecem ter o sombreamento de cor apropriado quando alterados no Unity, meu intestino me diz que esta é a melhor cor de base, o que significa que eu posso importar um único sprite quadrado branco e simplesmente ajustar a cor para representar objetos diferentes e estados do objeto.
Um sprite branco é realmente o melhor sprite de cor para começar e por que algo assim funciona no Unity, em vez de ajustar o matiz e a saturação no Photoshop?
Primeiro, defina "melhor".
— Krythic #
O branco é a melhor cor de base para uma representação verdadeira. Manter a escala de cinza do sprite também pode facilitar alguns ajustes de cor para as equipes etc.
O Unity aplica um Multiplymodo de mesclagem à textura e cor do sprite.
O tipo de cor da unidade varia de 0 a 1, inclusive.
Color.White é igual a (1, 1, 1, 1).
Sabendo que o 1tempo é algo em si.
Se a escala de cinza texturefor combinada com o Colorcampo Sprite Renderer , cada pixel será ele próprio. Alterar esse campo simplesmente multiplicará cada valor uniforme da escala de cinza por cada componente da cor.
Você pode jogar com o modo de mesclagem Multiplicar no seu editor de imagens favorito, como Photoshop ou GIMP.
As cores da unidade possuem 4 valores flutuantes típicos de muitos formatos de cores RGBA, correspondentes aos valores percentuais individuais das cores Vermelho, Verde, Azul e canal de transparência Alpha.
Além disso, como mencionado acima, o "Tonalidade" padrão aplicado pelo Unity é um sombreador multiplicativo que o Photoshop chama esse efeito de "Multiplicar" e o processo está literalmente multiplicando os valores de cores nos pixels do seu sprite pelo valor selecionado.
O problema disso é que um sombreador matemático de cores multiplicativo sempre produzirá o mesmo matiz (se você "multiplicar" por branco) ou cores mais escuras se você multiplicar por qualquer outra coisa. Me deparei com a situação em que queria o efeito exatamente oposto em uma situação do tipo de ferraria. O metal aquecido não deve ser multiplicado pelo amarelo para produzir uma tonalidade mais escura:
Em vez disso, reescrevi o sombreador multiplicativo padrão do Unity para ser um aditivo. Os resultados foram mais parecidos com o que eu estava procurando:
Fornecerei uma essência do Sprites-Additive.shader reescrito , se alguém estiver interessado.
Aqui está uma boa referência sobre terminologia e modos de cores: http://www.northlite.net/ps/blend.htm
Um usuário sem reputação suficiente para comentar manifestou interesse em ver o código de sombreador para esse efeito. Você ainda o tem disponível para compartilhar?
Ei, eu não o tenho disponível agora, mas vou desenterrá-lo e obter um link o mais rápido possível. Hoje à noite, se possível.
Retiro isso, achei-o com relativa facilidade e o adicionei a um Gist no meu GitHub. A única diferença MAIOR entre um sombreador aditivo e um multiplicador é lidar com transparência. No sombreador aditivo, defino um corte de transparência de 10% para manter o alfa relativo de pixels com baixos valores de alfa. Você não precisa se preocupar com esse tipo de coisa em um shader multiplicativo devido à natureza dessa matemática.