Sur la base du code de shader que vous avez publié, vous n'interpolez pas les UV à partir des sommets - il semble plutôt que vous interpolez la position 3D (fragVert
), puis calculez les UV en les transformant en coordonnées sphériques.
Votre analyse est correcte dans la mesure où la plus petite mipmap est choisie en cas de discontinuité, car la sélection de mipmap est basée sur des dérivés estimés numériquement à partir des UV utilisés dans les pixels voisins. Quand un pixel a u = 0 et un autre a u = 1, vous obtenez une très grande dérivée. Votre tentative de correction a le même problème en ce sens que les grandes dérivées se produisent autour de u = 0,01 et u = 0,99, c'est pourquoi deux coutures apparaissent de chaque côté de l'endroit où se trouvait la couture d'origine.
Une approche relativement simple pour résoudre le problème serait de décider quel niveau de mip utiliser vous-même et d'appeler textureLod
pour l'échantillonner directement. Si la planète va toujours être assez proche de la caméra, vous pouvez simplement coder en dur le niveau de mip à 0 (ou, d'ailleurs, ne pas inclure du tout les niveaux de mip dans la texture). Sinon, il pourrait être basé sur le log2 de la distance du point à la caméra, mis à l'échelle par certains facteurs appropriés. Notez que cela désactivera efficacement le filtrage anisotrope.
Une approche plus «correcte» consisterait à calculer certains dérivés de meilleure qualité. Au lieu d'utiliser dFdx
et dFdy
sur les UVs, qui ont discontinuités en raison de la atan2
, vous pouvez appliquer dFdx
et dFdy
àfragVert
(qui seront continus tout autour de la sphère), puis utiliser du calcul (règle de chaîne) pour trouver la formule pour obtenir les dérivés UV de la position des dérivés. Ce sera plus compliqué et plus lent, mais a l'avantage que le filtrage anisotrope devrait fonctionner.
Enfin, puisque vous êtes nouveau sur OpenGL, je noterai que bien que le calcul des UV à partir de coordonnées sphériques soit un moyen parfaitement valide pour texturer une sphère, ce n'est pas la manière "habituelle" que la plupart des gens choisissent. Il est plus courant de créer un maillage de sphère dont les UV sont spécifiés par sommet et qui sont simplement passés du vertex shader au pixel shader (interpolé linéairement sur chaque triangle). Les sommets sont placés le long de la couture, comme ceci , de sorte qu'il y a deux copies de chaque sommet, exactement aux mêmes positions, mais la moitié avec u = 0 connecté aux triangles d'un côté, et l'autre moitié avec u = 1 connecté à les triangles de l'autre côté. Cela élimine toute couture visible et ne nécessite aucune astuce dans le pixel shader.