Estou tentando criar um efeito brilhante para meu shader em tempo real, mas não sei como.
Aqui está um exemplo e outro exemplo .
Que técnica posso usar para implementar isso?
Estou tentando criar um efeito brilhante para meu shader em tempo real, mas não sei como.
Aqui está um exemplo e outro exemplo .
Que técnica posso usar para implementar isso?
Respostas:
Bem, quando nos pedem para projetar qualquer sombreador, devemos começar dividindo as coisas em problemas menores. E, como se observa, o efeito brilhante na verdade não faz o shader parecer bom, mas a iluminação e o efeito geral, usando apenas um deles, não parecerão tão bons.
Antes de tudo, vamos declarar o que não faz parte diretamente do shader:
Em segundo lugar, vamos dividir o shader real em efeitos separados:
Observe que esses tecidos têm infinitas normais normais, mas a técnica descrita aqui aproxima o padrão normal mais significativo
A fim de aproximar o, uma forma normal mais significativo para o fazer, é a utilização de coordenadas de textura e tangentes calcular da malha, e em vez de calcular N . L você calcula 1- (NT).
Explicação completa aqui . E você provavelmente precisará implementar isso no shader de fragmentos, em vez da técnica de vértice sobre a qual eles falam. Outros modelos anisotrópicos também podem ser aplicados.
Agora, para o efeito brilhante:
Isso pode ser feito no espaço mundial / espaço local de textura ou no espaço da tela como um passe separado.
O algoritmo em que consigo pensar usa a técnica de processamento de imagem (assumindo que a malha tenha cordas de textura).
Observe que a imagem acima é apenas um exemplo do filtro máximo, e aplicá-lo no ruído fornecerá sth semelhante a um campo estrela.
Exemplo de filtro gausiano aplicado ao ruído máximo (ed).
Observe que essa técnica pode precisar de otimização significativa para um sombreador em tempo real.
Há um artigo interessante AMD - Obtendo procedimentos .
Parece que os brilhos são mais difíceis do que eu penso.
Solução decente: use a posição 3D para indexar a função de ruído 3D, adicione o vetor de visualização, use a função frac para randomizar ainda mais as coisas.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);