Godot: Les normales de SurfaceTool ne peuvent pas être lissées lorsque des UV sont ajoutés

Créé le 13 août 2016  ·  3Commentaires  ·  Source: godotengine/godot

Testé sur Godot 2.1 beta et 2.1 stable, Windows 10 64 bits

Lors de la génération d'une surface avec SurfaceTool et la méthode add_smooth_group(true) , il est impossible d'obtenir des normales lisses si des UV sont ajoutés aux sommets.
J'ai trouvé que cela se produit spécifiquement lorsque les UV n'augmentent pas d'un sommet à un autre. Donc, si chaque quad d'une surface a des UV allant de 0 à 1, le quad sera rendu avec des normales de faces dures.
À cause de cela, je suis obligé de générer moi-même des normales.

Je ne sais pas si c'est un bogue parce que je crois qu'il a été implémenté, donc il le fait. Mais comme je l'ai dit, il est possible d'avoir des normales lisses même dans ce cas, donc cela peut être amélioré.

Reproduction :
SurfaceToolSmoothShading.zip
Lancez la scène principale, voyez la surface générée à gauche avec les UV a des faces dures, celle de droite n'en a pas et a des faces lisses, tandis que les deux ont un groupe lisse.

bug confirmed core

Commentaire le plus utile

ça arrive encore :
SurfaceToolSmoothShading.zip

Je crois que cela se produit parce que SurfaceTool suppose que le lissage ne peut se produire que si les sommets sont partagés, et pour être partagés, les sommets doivent avoir des attributs égaux. S'il est vrai que ce cas leur donne des UV différents, le lissage devrait toujours être possible avec deux sommets avec des UV différents, mais donnant deux normales ayant la même valeur.

Tous les 3 commentaires

HI @Zylann Je
J'utilise godot 3.0.4 et, en utilisant add_smooth_group comme vous l'êtes, je le restitue correctement, avec UV.
[edit] Je dois me corriger, le problème est toujours là, mais je dois préciser, comme Zylann l'a fait dans le code, que cela ne fonctionne que si les UV sont répartis sur le maillage, mais pas lorsqu'ils sont répétés pour chaque quad :

# 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 Pouvez-vous (ou quelqu'un d'autre) toujours reproduire ce bug dans Godot 3.2.1 ou 3.2.2beta4 ?

ça arrive encore :
SurfaceToolSmoothShading.zip

Je crois que cela se produit parce que SurfaceTool suppose que le lissage ne peut se produire que si les sommets sont partagés, et pour être partagés, les sommets doivent avoir des attributs égaux. S'il est vrai que ce cas leur donne des UV différents, le lissage devrait toujours être possible avec deux sommets avec des UV différents, mais donnant deux normales ayant la même valeur.

Cette page vous a été utile?
0 / 5 - 0 notes