İleri nedir ve nasıl çalışır?


18

OpenGL belgeleri bu fwidth belirtiyor returns the sum of the absolute value of derivatives in x and y.

Bu daha az matematiksel terimlerle ne anlama geliyor ve onu görselleştirmenin bir yolu var mı?

Fonksiyonu anlamaya dayanarak, komşu piksellerdeki fwidth(p)değerine erişebilir p. Bu, performansı önemli ölçüde etkilemeden GPU'da nasıl çalışır ve tüm piksellerde güvenilir ve düzgün bir şekilde çalışır mı?

Yanıtlar:


18

Piksel ekran alanı türevleri yapmak yüzden konum serbest görünümü belirli bir noktadan, büyük ölçüde darbe performansı, ancak kullanmak olsun ya da olmasın onlar performansını etkileyebilir!

Yakın geçmişteki her GPU dört pikselden oluşan bir dörtlü bir araya getirir ve aynı çözgü / dalga cephesine yerleştirir, bu da aslında GPU'da yan yana koştukları anlamına gelir, bu nedenle onlardan değerlere erişmek çok ucuzdur. Çözgü / dalga önleri kilit adımında çalıştırıldığı için, diğer pikseller de gölgelendiricide olduğu gibi aynı yerde olacaktır, bu nedenle pbu piksellerin değeri sizi bekleyen bir kayıtta oturuyor olacaktır. Bu diğer üç piksel, sonuçları atılsa bile her zaman yürütülür. Böylece, tek bir pikseli kapsayan bir üçgen her zaman dört pikseli gölgeleyecek ve üçünün sonuçlarını atacak, böylece bu türev özellikleri işe yarayacak!

Bu, (şu anki donanım için) kabul edilebilir bir maliyet olarak kabul edilir, çünkü sadece fwidthbu türevleri kullanmak gibi işlevler değildir : her bir doku örneği, dokunuzun hangi mipmap'inden okunacağını seçmek için de yapar. Şunu düşünün: Bir yüzeye çok yakınsanız, dokuyu örneklemek için kullandığınız UV koordinatı, ekran alanında çok küçük bir türeve sahip olacaktır, yani daha büyük bir mipmap kullanmanız gerekir ve daha uzağınız varsa UV koordinatı ekran alanında daha büyük bir türev, yani daha küçük bir mipmap kullanmanız gerekir.

Daha az matematiksel olarak ne anlama geldiğine göre: fwidtheşdeğerdir abs(dFdx(p)) + abs(dFdy(p)). dFdx(p)değeri arasındaki fark, basitçe ppiksel x + 1 ve değeri ppiksel x, ve benzer için dFdy(p).


Yani, eğer dFdx(p) = p(x1) - p(x), o x1zaman ya (x+1)da (x-1), xdörtlü pikselin konumuna bağlı olarak olabilir . Her iki durumda x1da, aynı çözgü / dalga cephesinde olmak zorundadır x. Doğrumuyum?
ApoorvaJ

3
@ApoorvaJ dFdx2x2 ızgarasındaki 2 komşu pikselin her biri için esasen aynı değer hesaplanır. Ve bu değer sadece iki komşu değer arasındaki fark kullanılarak hesaplanır, eğer bu p(x+1)-p(x)ya da tam olarak burada p(x)-p(x-1)ne xolduğu fikrine bağlıysa . Ancak sonuç aynıdır. Yani evet, haklısın.
Chris, Reinstate Monica'ya

@ChristianRau Bu sorumu cevaplıyor. Teşekkürler.
ApoorvaJ

11

Tamamen Teknik açıdan, fwidth(p)olarak tanımlanır

fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))

Ve dFdx(p)/ , ve ekran boyutlarına göre dFdy(p)değerin kısmi türevleridir . Bu nedenle, bir piksel sağa ( ) veya bir piksel yukarı ( ) giderken nasıl davranacağını gösterirler .pxypxy

Şimdi pratik olarak nasıl hesaplanabilirler? Komşu piksellerin değerlerini biliyorsanız, pbu türevleri doğrudan sonlu farklılıkları gerçek matematiksel türevleri için bir tahmin olarak hesaplayabilirsiniz (ki bu tam olarak analitik bir çözümü olmayabilir):

dFdx(p) := p(x+1) - p(x)

Ama elbette şimdi p, komşu piksellerin (gölgelendirici programı içinde keyfi olarak hesaplanan herhangi bir değer olabilir) değerlerini nasıl bilebiliriz ? Tüm gölgelendirici hesaplamasını iki (veya üç) kez yaparak büyük ek yüke neden olmadan bu değerleri nasıl hesaplayabiliriz?

Ne biliyorsunuz, bu komşu değerler yine de hesaplanıyor, çünkü komşu piksel için bir parça gölgelendiricisi de çalıştırıyorsunuz. Yani ihtiyacınız olan tek şey, komşu piksel için çalıştırıldığında bu komşu parça gölgelendirici çağrısına erişmek. Ancak daha da kolaydır, çünkü bu komşu değerler de aynı zamanda hesaplanır.

Modern rasterleştiriciler, birden fazla komşu pikselden daha büyük karolarda parça gölgelendiricileri olarak adlandırır. En küçükte bunlar 2x2 piksel ızgarası olurdu. Ve böyle bir piksel bloğu için, her bir piksel için parça gölgelendirici çağrılır ve bu çağrılar mükemmel paralel kilit adımında çalışır, böylece tüm hesaplamalar bloktaki bu piksellerin her biri için aynı sırayla ve aynı zamanda yapılır (bu nedenle, mümkünse parçalayıcı gölgesinde dallanmanın, ölümcül olmasa da, kaçınılması gerekir, çünkü bir bloğun her çağrılması, en az biri tarafından atılsa bile, en az biri tarafından alınan her dalı keşfetmek zorunda kalacaktır. daha sonra sonuçlar, bu ilgili sorunun cevaplarında da belirtildiği gibi). Bu nedenle, herhangi bir anda, bir fragman gölgelendirici teorik olarak komşu piksellerin fragman gölgelendirici değerlerine erişebilir. Eğer bu değerler doğrudan erişim yok ederken, sen türev fonksiyonları gibi onlara hesaplanan değerlere erişimleri var dFdx, dFdy, fwidth, ...

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.