Godot: Os normais do SurfaceTool não podem ser suaves quando os UVs são adicionados

Criado em 13 ago. 2016  ·  3Comentários  ·  Fonte: godotengine/godot

Testado em Godot 2.1 beta e 2.1 estável, Windows 10 64 bits

Ao gerar uma superfície com SurfaceTool e o método add_smooth_group(true) , é impossível obter normais suaves se UVs forem adicionados aos vértices.
Eu descobri que isso acontece especificamente quando os UVs não estão aumentando de um vértice para outro. Portanto, se cada quadra de uma superfície tiver UVs variando de 0 a 1, a quadra será renderizada com normais de face rígidos.
Por causa disso, sou forçado a gerar eu mesmo normais.

Não tenho certeza se é um bug porque acredito que foi implementado e faz isso. Mas como eu disse, é possível ter normais suaves mesmo nesse caso, então isso pode ser aprimorado.

Repro:
SurfaceToolSmoothShading.zip
Abra a cena principal, veja que a superfície gerada à esquerda com UVs tem faces duras, a da direita não tem e tem faces suaves, enquanto ambas têm um grupo suave.

bug confirmed core

Comentários muito úteis

Ainda acontece:
SurfaceToolSmoothShading.zip

Acredito que isso aconteça porque SurfaceTool assume que a suavização só pode acontecer se os vértices forem compartilhados e, para serem compartilhados, os vértices devem ter atributos iguais. Embora seja verdade que este caso os faz ter diferentes UVs, a suavização ainda deve ser possível com dois vértices com diferentes UVs, mas dando dois normais com o mesmo valor.

Todos 3 comentários

HI @Zylann Eu estava pesquisando no Google em busca da maneira correta de suavizar uma malha gerada por código e me deparei com isso.
Estou usando o godot 3.0.4 e, usando add_smooth_group como você, estou reproduzindo corretamente, com UV.
[editar] Eu tenho que me corrigir, o problema ainda está lá, mas eu tenho que especificar, como Zylann fez no código, que funciona apenas se os UV estiverem espalhados pela malha, mas não quando repetidos para todos os quadrantes:

# If UVs are spread, normals are smooth.
  var t00 = Vector2(p00.x, p00.z) / Vector2(sx,sy)
  var t10 = Vector2(p10.x, p10.z) / Vector2(sx,sy)
  var t11 = Vector2(p11.x, p11.z) / Vector2(sx,sy)
 var t01 = Vector2(p01.x, p01.z) / Vector2(sx,sy)

@Zylann Você (ou qualquer outra pessoa) ainda pode reproduzir este bug no Godot 3.2.1 ou 3.2.2beta4 ?

Ainda acontece:
SurfaceToolSmoothShading.zip

Acredito que isso aconteça porque SurfaceTool assume que a suavização só pode acontecer se os vértices forem compartilhados e, para serem compartilhados, os vértices devem ter atributos iguais. Embora seja verdade que este caso os faz ter diferentes UVs, a suavização ainda deve ser possível com dois vértices com diferentes UVs, mas dando dois normais com o mesmo valor.

Esta página foi útil?
0 / 5 - 0 avaliações