In base al codice shader che hai pubblicato, non stai interpolando gli UV dai vertici, ma sembra che stai interpolando la posizione 3D ( fragVert
), quindi calcolando gli UV trasformandoli in coordinate sferiche.
L'analisi è corretta in quanto viene scelta la mipmap più piccola in caso di discontinuità, poiché la selezione della mipmap si basa su derivati stimati numericamente dagli UV utilizzati nei pixel adiacenti. Quando un pixel ha u = 0 e un altro ha u = 1 ottieni una derivata molto grande. La tua tentata correzione ha lo stesso problema in quanto si verificano grandi derivati intorno a u = 0,01 e u = 0,99, motivo per cui appaiono due cuciture su entrambi i lati di dove era la cucitura originale.
Un approccio relativamente semplice per risolvere il problema sarebbe quello di decidere quale livello di mip usare te stesso e chiamare textureLod
per campionarlo direttamente. Se il pianeta sarà sempre abbastanza vicino alla videocamera, potresti semplicemente codificare il livello di mip su 0 (o, del resto, semplicemente non includere affatto i livelli di mip nella trama). Altrimenti, potrebbe essere basato sul log2 della distanza del punto dalla telecamera, ridimensionato da alcuni fattori adeguati. Si noti che ciò disabiliterà efficacemente il filtro anisotropico.
Un approccio più "corretto" sarebbe quello di calcolare alcuni derivati di qualità superiore. Invece di utilizzare dFdx
e dFdy
sui UV, che hanno discontinuità a causa della atan2
, si potrebbe applicare dFdx
e dFdy
ai fragVert
(che sarà in continuo tutto intorno alla sfera), quindi usare un po 'di calcolo (regola della catena) per trovare la formula per ottenere i derivati UV dai derivati di posizione. Questo sarà più complicato e più lento, ma ha il vantaggio che il filtro anisotropico dovrebbe funzionare.
Infine, dato che sei nuovo di OpenGL, noterò solo che mentre il calcolo degli UV da coordinate sferiche è un modo perfettamente valido per strutturare una sfera, non è il modo "solito" che la maggior parte delle persone sceglie. È più comune costruire una mesh di sfere che abbia i raggi UV specificati per vertice e sia semplicemente passata dallo shader di vertice allo shader di pixel (interpolato linearmente su ogni triangolo). I vertici sono posizionati lungo la giuntura, in questo modo , in modo tale che ci siano due copie di ciascun vertice, esattamente nelle stesse posizioni, ma metà con u = 0 collegato ai triangoli su un lato e l'altra metà con u = 1 collegato a i triangoli dall'altra parte. Questo elimina qualsiasi cucitura visibile e non richiede alcun trucco nel pixel shader.