Sombreamento suave com nós?

Aug 26 2020

Atualmente estou tentando construir um sombreador de estilo Anime no blender e editar os normais para obter um sombreamento melhor. Mas eu também quero um efeito de fresnel que não seja afetado pelos normais editados. Eu sei que há essa saída normal verdadeira no nó de geometria, mas ela me dá apenas os normais sombreados planos. Então, alguém conhece uma maneira de suavizar os normais com nós vetoriais ou algo que me dê normais sombreados suaves para o efeito fresnel?

Respostas

4 uvnoob Aug 26 2020 at 19:44

Espero que haja uma maneira melhor de fazer isso, mas aqui está uma solução alternativa que usei:

Copiei normais 'normais' para uma camada uv via script. Duas camadas para ser exato. Embora eu pudesse tê-los compactado em uma única camada, isso teria aumentado a complexidade do sombreador

import bpy

ob = bpy.context.object

for loop in ob.data.loops :
    normal = ob.data.vertices[loop.vertex_index].normal
    ob.data.uv_layers["XY"].data[loop.index].uv = (normal.x, normal.y)
    ob.data.uv_layers["ZW"].data[loop.index].uv = (normal.z, 0)

Então, em shaders, eu pluguo o valor combinado na entrada de fresnel normal.

Aqui estão os exemplos de resultados da esquerda para a direita:

  1. Macaco padrão com fresnel padrão
  2. Com normals edite normais personalizados conectados a fresnel
  3. Com normals edite fresnel padrão

Os artefatos (áreas brancas nítidas) são devido à edição normal ruim, que eu aposto que você não terá em seu modelo. Caso contrário, os normais transportados de UVs parecem ser quase idênticos aos normais suavizados originais

EDIT: Conforme observado por Heinrich Tester, o normal de UV também deve ser transformado de objeto em espaço mundial antes de usar