Виходячи з опублікованого вами шейдерного коду, ви не інтерполюєте УФ-вершини з вершин - швидше здається, ви інтерполюєте 3D-положення ( fragVert
), а потім обчислюєте УФ-сигнали, перетворюючи на сферичні координати.
Ваш аналіз правильний тим, що найменша мірна карта вибирається тоді, коли є розрив, оскільки вибір mipmap заснований на похідних, які оцінюються чисельно за УФ-випромінюваннями, що використовуються в сусідніх пікселях. Коли один піксель має u = 0, а інший u = 1, ви отримуєте дуже велику похідну. У вашій спробі виправлення виникає та сама проблема, що великі похідні трапляються приблизно u = 0,01 і u = 0,99, тому два шви з’являються з того боку, де був початковий шов.
Порівняно простий підхід до вирішення проблеми полягав би в тому, щоб визначитися, яким рівнем мип використовувати себе, і зателефонувати, textureLod
щоб безпосередньо випробувати його. Якщо планета завжди буде досить близькою до камери, ви можете просто жорстко зафіксувати рівень миші до 0 (або, з цього приводу, просто не включати рівні тексту в текстуру взагалі). В іншому випадку це може бути засноване на log2 відстані точки від камери, масштабованої деякими придатними факторами. Зауважте, що це ефективно відключить анізотропну фільтрацію.
Більш "правильним" підходом було б обчислення деяких похідних вищої якості. Замість використання dFdx
та ультрафіолетових випромінювань dFdy
, які мають розриви внаслідок atan2
, ви можете застосувати dFdx
та dFdy
до fragVert
(який буде безперервним навколо усієї сфери), а потім скористайтесь деяким обчисленням (ланцюговим правилом), щоб знайти формулу для отримання похідних УФ від похідних позицій. Це буде складніше і повільніше, але має ту перевагу, що анізотропна фільтрація повинна працювати.
Нарешті, оскільки ви новачок у OpenGL, я лише зазначу, що обчислення УФ-спектрів за сферичними координатами є ідеально правильним способом текстурування сфери, більшість людей вибирає це не «звичайний» спосіб. Частіше побудувати сферичну сітку, яка має ультрафіолетові випромінювання, вказані на вершину, і просто передається від вершинного шейдера до піксельного шейдера (лінійно інтерпольованого через кожен трикутник). Вершини розміщують уздовж шва, як це , таким чином, що є дві копії кожної вершини, в абсолютно однакових положеннях, але половина з u = 0, з'єднана з трикутниками з одного боку, а інша половина з u = 1, з'єднана з трикутники з іншого боку. Це виключає будь-який видимий шов і не вимагає жодних хитрощів у піксельній шейдері.