Mipmaplarla doku koordinat süreksizliği dikişler oluşturur


9

OpenGL öğrenmeye yeni başladım ve mipmap'larla bir küre tekstüre ederken bu eseri alıyorum. Temel olarak, parça dokumun kenarını örneklediğinde, süreksizliği algılar (1'den 0'a kadar) ve bu çirkin dikişi oluşturan en küçük mipmap'i seçer:

çirkin dikiş http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png

Bu yüzden textureGrad kullanarak degradeleri manuel olarak geçersiz kılmaya çalıştım:

//fragVert is the original vertex from the vertex shader
vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5));
vec2 ll2 = ll;
if (ll.x < 0.01 || ll.x > 0.99)
    ll2.x = .5;
vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2));

Şimdi bir yerine iki dikiş alıyorum. Onlardan nasıl kurtulabilirim? Ve yukarıdaki kod neden 2 dikiş üretiyor?

2 eam http://cdn.imghack.se/images/44a38ef13cc2cdd801967c9223fdd2d3.png

İki görüntüden anlatamazsınız, ancak 2 dikiş orijinal dikişin her iki tarafındadır.


2
Küreniz bir ağ mı yoksa küreyi gölgelendiricide veya benzeri bir şekilde analitik olarak mı izliyorsunuz? Eğer bir ağ varsa, insanlar genellikle dikiş boyunca köşeleri kopyalayarak çözerler, böylece bir taraftaki verts u = 0 ve diğer taraf u = 1 olabilir.
Nathan Reed

Kodunuzun neden iki dikiş oluşturduğuna gelince, bunun iki süreksizlik yaratması nedeniyle bekliyorum - biri u 0,01'den 0,5'e, diğeri u 0,99'dan 0,5'e atlıyor. U 0'dan 1'e atladığında aynı sorun - bir atlama kadar büyük değil ama yine de büyük bir atlama.
Nathan Reed

Küre için bir ağım var. Bu bir dekahedron, böylece köşeler dikişle aynı hizada değil. İki dikiş ile ilgili komik olan şey orijinal dikişin gitmiş olmasıdır. Ayrıca, .01 veya .99'a sıkıştırsam bile aynı 2 dikişi alıyorum.
omikun

İki dikişli kılıfın ekran görüntüsünü gönderebilir misiniz? Ve UV'leri nasıl üretiyorsunuz (kodunuzun ilgili kısmını gönderebilir misiniz)? Onları prosedürel olarak gölgelendiricide ürettiğinizi, sadece köşelerden enterpolasyon yapmakla kalmayıp, dodecahedron ağınızın hiç işe yaramayacağını varsayıyorum.
Nathan Reed

Soruyu 2 dikişin resmiyle güncelledim, orijinal dikişin her iki tarafındalar, ancak orijinal dikiş orada değil. Bence UV, köşelerden enterpolasyonlu, emin değilim. Kod şimdi söz konusu.
omikun

Yanıtlar:


4

Gönderdiğiniz gölgelendirici koduna göre, UV'leri köşelerden enterpole etmiyorsunuz - bunun yerine 3D konumunu ( fragVert) enterpole ettiğiniz , ardından küresel koordinatlara dönüşerek UV'leri hesapladığınız anlaşılıyor .

Mipmap seçimi, komşu piksellerde kullanılan UV'lerden sayısal olarak tahmin edilen türevlere dayandığından, analiziniz, en küçük mipmap'in bir süreksizlik olduğunda seçilmesi nedeniyle doğrudur. Bir pikselin u = 0, diğerinin u = 1 olması durumunda çok büyük bir türev elde edersiniz. Düzeltmeye çalıştığınız sorun, u = 0.01 ve u = 0.99 civarında büyük türevlerin ortaya çıkmasıyla aynı soruna sahiptir, bu nedenle orijinal dikişin her iki tarafında iki dikiş görünür.

Sorunu çözmek için nispeten basit bir yaklaşım, hangi mip seviyesinin kendiniz kullanılacağına karar vermek ve textureLoddoğrudan örneklemeye çağırmak olacaktır. Gezegen her zaman kameraya oldukça yakın olacaksa, mip seviyesini 0 olarak sabit bir şekilde kodlayabilirsiniz (veya bu nedenle dokuya mip seviyelerini eklemeyin). Aksi takdirde, noktanın kameradan uzaklığının log2'sine dayanabilir ve bazı uygun faktörlerle ölçeklendirilebilir. Bunun anizotropik filtrelemeyi etkili bir şekilde devre dışı bırakacağını unutmayın.

Daha "doğru" bir yaklaşım bazı yüksek kaliteli türevleri hesaplamak olacaktır. Bunun yerine kullanmanın dFdxve dFdynedeniyle kesintilere sahip Uvs, üzerinde atan2, uygulamak olabilir dFdxve dFdyhiç fragVertUV türevleri almak için formülü bulmak için, sonra bazı hesap (zincir kuralı) kullanan (kürenin etrafında tüm yol sürekli olacak olan) pozisyon türevlerinden. Bu daha karmaşık ve daha yavaş olacaktır, ancak anizotropik filtrelemenin çalışması avantajı vardır.

Son olarak, OpenGL'de yeni olduğunuz için, küresel koordinatlardan UV'leri hesaplarken bir küreyi dokulamak için mükemmel geçerli bir yol olduğunu, çoğu insanın seçtiği "olağan" yol olmadığını unutmayın. Köşe başına belirtilen UV'lere sahip olan ve köşe gölgelendiricisinden piksel gölgelendiricisine (her üçgende doğrusal olarak enterpolasyonlu) geçirilen bir küre ağı oluşturmak daha yaygındır. Tepe, dikiş boyunca yerleştirilir bu şekilde tam olarak aynı pozisyonlarda her köşe iki kopyası vardır, öyle ki, ancak u yarım bir tarafında üçgen bağlı = 0 ve u ile diğer yarısı 1'e bağlı = diğer taraftaki üçgenler. Bu, görünür dikişleri ortadan kaldırır ve piksel gölgelendiricisinde herhangi bir numara gerektirmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.