Metalde mipmap seviyeleri nasıl hesaplanır?


14

Cevabım özellikle Metal ile ilgili, çünkü cevabın başka bir API için değişip değişmeyeceğini bilmiyorum.

Şimdiye kadar anladığımı düşündüğüm şey şudur:

  • Bir mipmaplı doku, orijinal dokuyu anlamlı bir şekilde altörnekleyerek daha düşük ayrıntı düzeylerinin oluşturulduğu "ayrıntı düzeylerini" önceden hesaplamıştır.

  • Mipmap seviyelerine, seviyenin 0orijinal doku olduğu ve daha yüksek seviyeler, iki azalmanın gücü olduğu azalan ayrıntı düzeyinde ifade edilir .

  • Çoğu GPU, her örnek için iki komşu mipmap düzeyini, her düzeydeki numuneleri bilinear filtreleme kullanarak seçen ve daha sonra bu örnekleri doğrusal olarak karıştıran üç boyutlu filtreleme uygular.

Tam olarak anlamadığım şey, bu mipmap seviyelerinin nasıl seçildiğidir. Gelen belgeleri metal standart kütüphanenin, I örnekleri ile ya da bir örneğini belirtmeksizin alınabilir bkz lod_optionstürü. Bu argümanın mipmap seviyelerinin seçilme şeklini değiştirdiğini ve lod_options2D dokular için görünüşte üç çeşit olduğunu varsayıyorum :

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

Ne yazık ki, belgeler bu seçeneklerden herhangi birinin ne yaptığını açıklama zahmetine girmiyor. bias()Önyargının otomatik olarak seçilen bir ayrıntı düzeyini saptadığını tahmin edebilirim , ama sonra önyargı ne anlama valuegeliyor? Hangi ölçekte çalışıyor? Benzer şekilde, nasıl olduğu lodhakkındaki level()ayrık mipmap seviyelerine çevrildi? Ve gradient2d()doku koordinatının gradyanını kullanan varsayım altında çalışarak, mipmap seviyesini seçmek için bu gradyanı nasıl kullanır?

Daha da önemlisi, lod_optionsatlarsam, mipmap seviyeleri nasıl seçilir? Bu, yürütülmekte olan işlevin türüne göre değişir mi?

Ve sample()işlevin varsayılan no-lod-options-belirtilmiş işlemi, gradient2D()(en azından bir parça gölgelendiricide) gibi bir şey yapmaksa, basit ekran alanı türevlerini kullanıyor mu veya doğrudan rasterleştirici ve enterpolasyonlu doku koordinatları ile çalışıyor mu? kesin bir gradyan hesaplamak için?

Ve son olarak, bu davranışın herhangi biri cihazdan cihaza ne kadar tutarlıdır? Eski bir makale (DirectX 9'daki gibi) Okudum karmaşık cihaza özgü mipmap seçimine atıfta bulunmuştum, ancak mipmap seçiminin daha yeni mimarilerde daha iyi tanımlanıp tanımlanmadığını bilmiyorum.

Yanıtlar:


17

Mip seçimi, günümüzde cihazlar arasında oldukça iyi bir şekilde standartlaştırılmıştır - anizotropik filtrelemenin nitritli ayrıntıları dışında, tanımlanması hala bireysel GPU üreticilerine bağlıdır (ve kesin ayrıntıları genellikle kamuya açıklanmamıştır).

Mip seçimi hakkında ayrıntılı olarak okumak için iyi bir yer OpenGL spesifikasyonu, bölüm 8.14, "Doku Minimizasyonu" ndadır . Metal'de de aynı şekilde çalıştığını varsayabilirim. (Elma could , hem donanımı hem de API'yi yaptıkları düşünüldüğünde bir şeyleri değiştirmiş ... ama şüpheliyim.) Burada özetleyeceğim.

Varsayılan mip seçimi ( lod_options ), mip seviyelerini seçmek için doku koordinatlarının ekran alanı degradelerini kullanır. Temel olarak, metinlerin piksellerle 1: 1 eşlenmesine mümkün olduğunca yakın olan mip seviyelerini seçmeye çalışır. Örneğin, degradelerin piksel başına 4 metin uzunluğunda olması durumunda, mip düzey 2'yi seçer (0 düzeyinin 1 / 4'üdür ve bu nedenle size piksel başına 1 mipli metin verir).

Üçüncül filtreleme ile, genellikle tam bir 1: 1 haritaya inmediğiniz için, en yakın iki seviyeyi alır ve aralarında lineer olarak enterpolasyon yapar, böylece sahne alanınızdaki kamera veya nesneler hareket ederken mip seviyeleri arasında yumuşak bir geçişe sahip olursunuz. etrafında.

λλλλ=2.8

λlog2(1/4)=2 ).

Şimdi, değiştirici seçeneklerine gelince:

  • biasλmip seviyelerini seçmek için kullanmadan önce öğesine . Bu nedenle, örneğin, +1 yanlılığı, normalde olduğundan bir seviye daha yüksek mips kullanarak üçgensel filtreleme yapmasını sağlar. −1'lik bir sapma, bir seviye daha düşük olan mipleri kullanır ve bu böyle devam eder.
  • levelλλlod
  • gradient2ddoku koordinatlarının kapalı ekran alanı degradelerinin yerini alan kendi degrade vektörlerinizi koymanızı sağlar. Mip seçiminin ve örnekleme işleminin geri kalanı normal olarak, ancak değişen gradyanlarla devam eder. Bu, anizotropik filtrelemeyi özelleştirmenizi sağlar.

Parça gölgelendiricilerin yanı sıra diğer gölgelendirici türlerinde "ekran boşluğu gradyanları" kavramı yoktur, bu nedenle son iki işleme genellikle izin verilen tek işlemdir - örtük degradeleri kullanmaya çalışan herhangi bir işlem derleme hatası verir. Metal'in yaptığı gibi pozitif değilim, ancak diğer API'larla çalışmayı beklediğim şey bu.

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.