Estudos de shaders no Unity

Eu já mexi um pouco com shaders, tanto no Unity quanto em XNA, mas nunca tive um conhecimento muito grande sobre o assunto. Na semana passada eu encontrei um material bem bacana sobre shaders no Unity e decidi fazer as vídeo-aulas pra me aprofundar um pouco mais nessa área. São dez aulas de uns 15 ou 20 minutos que ensinam desde o básico de como os shaders funcionam dentro do Unity (que acaba sendo um pouco diferente por causa do ShaderLab) até como criar seus próprios efeitos.

Até aqui, eu fiz seis aulas. O mais interessante, pra mim, foi justamente a aula seis, que discute como criar seu próprio modelo de iluminação. Por padrão, o Unity suporta os modelos  de Lambert ou BlinnPhong. Com isso, ao escrever um shader você pode “herdar” de um destes dois modelos e basicamente escrever o pixel shader, deixando o Unity tomar conta do resto. Como isso deixa muita coisa escondida por trás dos panos, esse tutorial serve justamente pra entender como o shader funciona sem usar um modelo pronto. Acaba sendo uma ótima visão mais geral de como a coisa toda funciona. O resultado esta na imagem abaixo, à esquerda (é só um Phong bem simples).

Também consegui brincar um pouco carregando um mapa de especular separado pra complementar o quarto tutorial, que trata de adicionar este componente no modelo de iluminação. No vídeo, ele ensina a usar o alfa da própria textura difusa para definir onde o especular seria aplicado, mas eu adicionei um mapa de especular como um parâmetro extra e busquei nele essa informação do alfa. É uma alteração simples, mas já dá pra sentir um pouco como é fazer este tipo de alteração nos shaders.

Unity shaders

Pra programar, eu uso o Visual Studio 2012 e ele não tem um syntax highlighting para shaders. Pra solucionar isso, usei o NShader, mas como os shaders do Unity não estão diretamente em HLSL, CG ou GLSL, é preciso um passo extra pra fazer a coloração funcionar. A solução está aqui e consiste em alterar um arquivo do NShader pra ele passar a colorir arquivos com a extensão .shader também. Ainda estou procurando uma solução de auto-completar, mas por enquanto dá pra me virar bem sem isso.

Por fim, eu criei um repositório pra armazenar o resultado das aulas e os experimentos que eu fizer sobre isso. Quem tiver interesse, pode acessar aqui.