Este blog esta em reforma no momento.

Fazendo Shaders

Hoje fiquei lembrando de um método de aprendizado que uso desde meus cinco anos: "Se não entende, pega o bagulho e desmonta!"
Nem todos os brinquedos daquela época sobreviveram. Mas hoje em dia temos esse processo mais formalizado.

De fato cansei mesmo de tentar pegar código pronto e tentar juntar os pedaços para um resultado. A maioria dos projetos hoje em dia faz isso.
Mas não estava dando um resultado muito bom, tendo conflitos, dor-de-cabeça pra entender o shader, conflitos de linguagens, de perfis e minúsculos fatores. As vezes eu simplesmente esquecia os drivers de vídeo desconfigurados e não compilava!
Além doque a maioria dos exemplos que vi era de gente pegando os códigos existentes e adaptando.

Procurando tutorial ?
Eu escrevi o texto acima para os que vieram atrás de código para seus projetos, mas deixei os links que vocês procuram no final do post.
Fica esse alerta, a programação de shaders é de baixo nível, mas muito recompensador.

Os passos
 Quando o assunto é shader você tem quase nenhum material em português e muito falatório sobre o assunto em inglês. E nenhuma referência para newbie para aquilo que você quer fazer.

Comecei com um esdrúxulo void main(void) pegando a componente de cor e uns 3 ou 4 exemplos de toon shader.

O algoritmo do toon é fácil, você pega a intensidade do brilho e joga numa sequência de ifs. Simplesmente a coisa a parte mais babaca de programação. Outra vantagem de eu estar fazendo o shader  é que eu posso customizar ainda mais o sistema, ou eu faço uma textura linear de entrada ou uma array.
 A iluminação "per pixel" que começou a dar trabalho. Não tanto o de copiar e colar, mas ir lendo os comandos passo a passo.
Do exemplo acima eu fui sondando, essa parte de programação é muito voltada a matemática, não aquela chata que agente fazia decorando formulas estranhas, mas exige bastante conceito que eu não aprendi na escola. E a capacidade de "visualizar" a equação funcionando, "ver" a equação sempre foi a melhor maneira de aprender pra mim doque decorar a formula.
 Me acalmei e vi que era só eliminar todo o calculo correspondente a cor na equação. E pronto, tinha um valor para ser analisado e dividido no degrade.
Tem uma hora que me confundo entre usar um + (adição) e um *(multiplicação) na equação, mas é só fazer uma "tentativa e erro" que acerto.

A luz foi resolvida de forma mais simples, eu entro com os valores na mão ao invés de usar os definidos dentro da OpenGL, isso vai ser bom para controlar os pontos de luz de entrada. No caso do toon shading é uma escolha melhor já que a luz nem sempre fica boa se for muito realista, então se eu controlar manualmente por script deve dar um resultado melhor.
Agora o passo do normalmap, acabou virando uma técnica vital e me surpreendeu a facilidade que foi inserir ele.
A única coisa problemática foi computar a exata direção do vetor da luz e o vetor da normal na posição correta.
O shader esta quase pronto, eu deixei de lado coisas como os dados de cor do vértice, oque limita o sistema a sempre precisar de texturas para todos os modelos.
Não creio que vai ser preciso uma versão mais simples desse shader, eu poderia usar os dados de cor dos vértices por exemplo mas se o sistema não suportar texturas eu deixo a cargo da OGRE escolher a técnica mais correta.

Mas uma mais complexa com o efeito paralax sim tem que sair, no entanto esse me dá medo! Mas é o desafio para a próxima semana.

Links:
Código fonte do shader *
Tutorial de Toon Shading e GLSL
Tutorial no NeHe
Referência da Blender Game Engine para o 2.5x
Realmente grande site de tutoriais de Blender
www.khronos.org

Discussões e fóruns que pesquisei:
link1 link2 link3 link4  link5 (++) link6 e mais....

* o código está conforme oque se vê aqui, não esta pronto mas funciona com duas texturas em um material. Fica como contribuição para novos projetistas.

Comentários