Ekran alanı türevleri nedir ve ne zaman kullanırım?


12

Ve glsl fonksiyonlarını görüyorum ddxve ddyhlsl eşdeğerleri her zaman gölgelendirici kodunda geliyor. Şu anda bir teğet veya bitangent olmadan yumru haritalama yapmak için kullanıyorum ama temelde kodu kopyaladı. Bu işlevlerin gerçekte ne olduğunu, ne yaptıklarını ve ne zaman kullanmaya bakacağımı anlamıyorum.

Yani sorular:

  1. Ekran alanı türevlerinin işlevleri nelerdir?
  2. Bu işlevler ne işe yarar? Giriş değerleri ve çıkış değerleri
  3. En sık hangi etkiler için kullanılır?
  4. Bu işlevlere bakmanız için ne tür etkiler gerekir?

Geçmişte bunları, çözgü bazı parçalar için yanlış miplevel'in seçilmesine neden olabileceği doku çözgüleri için kullandım; tipik olarak daha düşük bir miplevel, böylece dokuyu çözüldükçe çok görünür bir şekilde kaydığını görebilirsiniz. Çözülmemiş texcoordların türevlerini almak, sonra çözgüyü hesaplamak, sonra da çözülmüş texcoordlar ve türevleri ile tex2Dgrad / SampleGrad / textureGrad kullanmak bunun olmasını engeller.
Maximus Minimus

@ LeComteduMerde-fou Doku çözgüleri nelerdir? Hızlı bir google, demek istediğini sordu?
NeomerArcana

Hayır, demek do çözgü yani zamanla doku Coords değiştirerek doku çarpıtarak,.
Maximus Minimus

Bu ilgili soruya bakın . Bağlantılı soru, bu işlevlerin nasıl çalıştığı / nasıl hesaplandığı hakkında daha fazla soru sorduğundan, bunun bir kopya olduğunu düşünmüyorum, bunun yerine "bu nedir ve ne işe yarar?"
DMGregory

Merhaba ben çok ilgileniyorum şu anda onları teğet veya bitangent olmadan yumru haritalama yapmak için kullanıyorum ama temelde kodu kopyaladı. ... bunun için kullanmayı düşünüyordum ... ama bu ekran-uzay türevini ucuz lineer cebir kullanarak dünya-uzay normlarına nasıl dönüştüreceğimizi bilmiyorum. Belki de kamera projeksiyon matrisinin tersine ihtiyacım var.
Prokop Hapala

Yanıtlar:


12

İlk olarak, GPU'ların her zaman bir kerede 2x2 piksel bloğundaki parça / piksel gölgelendiricileri değerlendirdiğini bilmeye yardımcı olur. (Bu piksellerin yalnızca bir kısmının sonuçta çizilmesi gerekse bile, diğerleri çokgenin dışında veya tıkalı olsa da - gereksiz parçalar sonunda yazılmak yerine maskelenir).

Rasterleştirilmiş bir üçgende türevleri gösteren diyagram

vGölgelendiricinizdeki bir değişkenin (veya ifadenin) ekran alanı türevi, vbu 2x2 piksel dörtlünün bir tarafından diğerine (koddaki o noktada) değerindeki farktır . yani. ddxdeğeridir vsağ piksel eksi değeri vsol ve benzer için ddydikey üzerinde.

Bu, " vekran boyunca yatay (ddx) veya dikey (ddy) hareket ettikçe ne kadar hızlı artar veya azalır?" - yani. matematik terimleriyle, değişkeninizin kısmi türevlerine yaklaşır (yaklaşık çünkü fonksiyonun sonsuz davranışını matematiksel olarak değerlendirmek yerine her bir parçada ayrık örnekler kullanır)

Skaler miktarlar için, bunu , ekran alanı yönünü en hızlı şekilde artıran bir gradyan vektörü olarak da görebiliriz .∇v = float2(ddx(v), ddy(v))v

Bu tür bilgiler genellikle dahili olarak , doku aramaları için uygun bir mipmap veya anizotropik filtreleme çekirdeği seçmek için kullanılır . Örneğin, kameram uvdokulu bir zemin düzleminin dikey yönüne neredeyse paralel görünüyorsa , ddy(uv.y)karşılaştırıldığında çok büyük olacaktır ddx(uv.x)(dikey eksen ekranda kısaltılmış olduğundan - bir piksel adım dikey olarak daha uzun bir doku alanını kaplar) Doku örnekleme donanımına, yapay doku oluşumlarını önlemek için dikey doku yönünü yataydan daha fazla bulanıklaştırmak için anizotropik filtrelemeye ihtiyacım olduğunu söyler.

En basit efektler için bu türevleri kullanmanıza gerek yoktur, çünkü temel 2D doku örnekleme yöntemleri bunu sizin için halleder. Ancak Le Comte du Merde-fou, yukarıdaki yorumda belirtildiği gibi, doku aramalarınızı bozduğunuzda, donanımın uygun filtrelemeyi seçmesine yardımcı olmak için kullanmak için ekran alanı türevlerini manuel olarak almanız ve / veya masaj yapmanız gerekebilir (örn. tex2DlodHLSL'de)

Ekran alanı etiketleri, tek bir 2x2 bloğun hesaplanan doku koordinatında büyük bir atlama süreksizliğini kapsayabileceği ve sistemin filtreleme seviyesini saf olarak hesaplamasına izin verirseniz lekelenmiş veya kenarları yumuşatılmış bir kenara yol açabilir. Bu makale, bu eserle ilgili ayrıntılara ve onu hafifletmeye yönelik yaklaşımlara girmektedir .

Bu türevler, prosedürel doku üretiminde gürültü işlevlerini kullanırken de kullanışlı olabilir. Örneğin, yordamsal gürültüyü normal bir haritaya dönüştürmek istediyseniz, ddx & ddy, gürültü değerinin geçerli parçanın yakınında nasıl değiştiğini ve hangi yönde eğimli olduğunu hesaplamak için basit, yaklaşık bir yol verir, böylece uygun bir normal oluşturabilir.

Kenar yumuşatma çizgileri veya kesişim vurguları oluşturma teknikleri , kalınlık / serpintiğin tutarlı olmasını ve geometriye veya görüş açısına bağlı olmamasını sağlamak için ekran alanı türevlerini de kullanabilir.

Journey'deki kum renderleme hakkındaki bu konuşmada konuşmacı, kumun bakış kenarları boyunca ne kadar parlak olduğunu kontrol etmek için bu türev fonksiyonlarını kullanabildiklerinden bahsediyorlardı ... eğer o zaman onlar hakkında biliniyorlarsa (bunun yerine bir mipmap hile kullandılar, Kaputun altında zaten bu tür türevler tarafından desteklenmektedir)

Dikkat edilmesi gereken son bir not: ekran alanı türevleri "kaba" / düşük hassasiyette (yani bir çift türev tüm dörtlü tarafından paylaşılır) veya "ince" / yüksek hassasiyette (yani her piksel sadece hemen dörtlü komşular, dörtlü üzerinde dört ayrı türev çifti verebilir). Kaba genellikle bol miktardadır, ancak etkinizde görünür 2x2 bloklar olduğunu fark ederseniz, ince / yüksek hassasiyete geçmek istediğiniz iyi bir ipucudur. ;)

(Üstteki şemada ince türevler için hesaplamalar kullandım, ancak sadece kendi başına ddx / ddy'nin kaba türevleri varsayılan olarak kullanabileceğine dikkat edin)


2x2 bloğunun bir tarafından diğer tarafına olan pikseller arasındaki fark olduğunu söylediğinizde, piksel değerindeki fark mı yoksa texel konumundaki fark mı? Değer farkı ise, arasındaki veya başka bir şeydeki metinleri özetliyor mu?
NeomerArcana

Bu, argümanın değerindeki fark ( vburada) ve 2x2'lik bir dörtlü olduğu için, aralarında piksel yok. Yani, dörtlü sol üst parçayı ve orada v = 1'i ve sağ üst parça v = 4'te gölgelendiriyorsak, ddx (v) = 3 (hareket ederken "v 3 artar soldan sağa ")
DMGregory

Hala tam olarak anlamıyorum. Bir açıyla izliyorsam, 2x2 bloğu dokudaki yan yana piksellerden oluşmayabilir. Değerler arasındaki fark, seçilen iki metin arasındaki fark mı yoksa seçilen iki metin arasındaki fark mı, atlananları dikkate alıyor mu?
NeomerArcana

Metinleri unutun - dokuyu örneklemiyor. Ddx veya ddy'ye ilettiğiniz argümanın değişmez değerini alır ve komşu parçayı değerlendirirken bunu ddx veya ddy'ye iletilen değerle karşılaştırır. Bu değer bir doku örneğinden geliyorsa, öyle olsun, ancak türev fonksiyonlarının herhangi bir doku bilgisi yoktur. Sadece sayıları çıkarırlar. Bilgisayarıma döndüğümde bu cevaba bir diyagram eklemeyi deneyeceğim.
DMGregory

Sanırım şimdi anlıyorum. Diyagram almak harika olurdu ama anlıyorum. Bunlar çok kullanışlı fonksiyonlar gibi görünüyor.
NeomerArcana
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.