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 .p
x
y
p
x
y
Şimdi pratik olarak nasıl hesaplanabilirler? Komşu piksellerin değerlerini biliyorsanız, p
bu 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
, ...
dFdx(p) = p(x1) - p(x)
, ox1
zaman ya(x+1)
da(x-1)
,x
dörtlü pikselin konumuna bağlı olarak olabilir . Her iki durumdax1
da, aynı çözgü / dalga cephesinde olmak zorundadırx
. Doğrumuyum?