Basierend auf dem Shader-Code, den Sie veröffentlicht haben, interpolieren Sie nicht die UVs von den Scheitelpunkten, sondern es scheint, dass Sie die 3D-Position interpolieren (fragVert
) und berechnen dann die UVs durch Transformation in sphärische Koordinaten.
Ihre Analyse ist insofern korrekt, als die kleinste Mipmap ausgewählt wird, wenn eine Diskontinuität vorliegt, da die Auswahl der Mipmap auf Ableitungen basiert, die numerisch aus den in benachbarten Pixeln verwendeten UVs geschätzt werden. Wenn ein Pixel u = 0 und ein anderes u = 1 hat, erhalten Sie eine sehr große Ableitung. Ihr versuchter Fix hat das gleiche Problem, da große Ableitungen um u = 0,01 und u = 0,99 auftreten, weshalb zwei Nähte auf beiden Seiten der ursprünglichen Naht erscheinen.
Ein relativ einfacher Ansatz zur Behebung des Problems wäre die Entscheidung, welche Mip-Ebene Sie verwenden und anrufen möchten textureLod
, um sie direkt zu testen. Wenn sich der Planet immer ziemlich nahe an der Kamera befindet, können Sie den Mip-Pegel einfach auf 0 fest codieren (oder die Mip-Pegel überhaupt nicht in die Textur aufnehmen). Andernfalls könnte es auf dem log2 der Entfernung des Punkts von der Kamera basieren, skaliert durch einige geeignete Faktoren. Beachten Sie, dass dadurch die anisotrope Filterung effektiv deaktiviert wird.
Ein "korrekterer" Ansatz wäre die Berechnung einiger Derivate höherer Qualität. Anstatt dFdx
und dFdy
auf den UVs zu verwenden, die aufgrund der Diskontinuitäten aufweisen atan2
, können Sie dFdx
und dFdy
auf fragVert
(die rund um die Kugel kontinuierlich sind) anwenden und dann einen Kalkül (Kettenregel) verwenden, um die Formel zu finden, um die UV-Derivate zu erhalten aus den Positionsderivaten. Dies ist komplizierter und langsamer, hat jedoch den Vorteil, dass die anisotrope Filterung funktionieren sollte.
Da Sie OpenGL noch nicht kennen, möchte ich nur darauf hinweisen, dass die Berechnung von UV-Strahlen aus sphärischen Koordinaten zwar eine absolut gültige Methode zur Texturierung einer Kugel darstellt, die meisten Menschen jedoch nicht die "übliche" Methode wählen. Es ist üblicher, ein Kugelnetz zu erstellen, bei dem UVs pro Scheitelpunkt angegeben und einfach vom Scheitelpunkt-Shader zum Pixel-Shader übergeben werden (linear über jedes Dreieck interpoliert). Scheitelpunkte werden entlang der Naht so platziert , dass zwei Kopien jedes Scheitelpunkts an genau denselben Positionen vorhanden sind, wobei die Hälfte mit u = 0 auf einer Seite mit den Dreiecken verbunden ist und die andere Hälfte mit u = 1 verbunden ist die Dreiecke auf der anderen Seite. Dies eliminiert jede sichtbare Naht und erfordert keine Tricks im Pixel-Shader.