Ddx (hlsl) aslında ne yapar?


17

Biraz kafam karıştı. Resmi belgeler ( http://msdn.microsoft.com/tr-tr/library/windows/desktop/bb509588(v=vs.85).aspx ), ddx'in (girdi), girdinin ilgili kısmi türevi olduğunu söylüyor "ekran alanı x koordinatı"

Kalkülüsüm iyi, ama girdinin nereden geldiğini nasıl anlayabilir? Eğer bir fonksiyonu geçersem, tamam, ne yapacağını hayal edebiliyorum, ama bir sayının türevi her zaman sıfırdır ...?

Sadece bir ölçek mi? Bu, bu mesafedeki boyutunun onda birine ölçeklenecek, bu yüzden onda biri dönecek mi? Ama sonra bir girdiye gerek yok ...

Birisi gerçekte ne olduğuna dair hızlı bir açıklama yapabilir mi?


2
ddxve ddykendin yapamayacağın bir sihir yap. Bir piksel gölgelendiricisinden edemeyeceğiniz rasterleştirme boru hattından ek bilgilere erişebilirler. Tam olarak hangi formülü kullandıklarından emin değilim; Bir tahmin tekniği kullandıklarına inanmaya yönlendirildim, ama kesin olarak bilmiyorum.
Sean Middleditch

Bu çok garip, ama yine de. Ddx (5) aslında neyi temsil eder? .1 diyorsa, bunu nasıl yorumlamalıyım? Veya -6?
Richard Rast

1
ddx(5)anlamsız. Girdi değeri ile kullanın ve bu size bir bloktaki komşu piksellere göre bu değerin türevini verecektir. Yine, değerleri tam olarak nasıl hesapladığını bilmiyorum, ancak girdi olmayan bir türevin sorulması sadece tanımlanmamış davranış olabilir ve çöp üretebilir. Verebileceğimden daha fazla bilgi için fgiesen.wordpress.com/2011/07/10/… adresine bakın .
Sean Middleditch

Emin değilim ama HLSL derleyicisinin aslında ddx / ddy'ye ilettiğiniz ifadenin tam sembolik farklılığını yapıyor olması iyi olabilir. blogs.msdn.com/b/chuckw/archive/2011/03/08/… araştırma.microsoft.com
pubs/

Bu ne işe yarıyor? SADECE açıkçası biraz mantıklı şey.
MickLH

Yanıtlar:


32

Dahili olarak, GPU'lar asla bir kerede bir piksel gölgelendiricisinin bir örneğini çalıştırmaz. En ince ayrıntı düzeyinde, bir SIMD mimarisi kullanarak her zaman aynı anda 32-64 piksel çalıştırıyorlar. Bunun içinde, pikseller ayrıca 2x2 dörtlü olarak düzenlenmiştir, bu nedenle SIMD vektöründeki 4 ardışık pikselden oluşan her bir grup, ekranda 2x2 piksel bloğuna karşılık gelir.

Türevler, dörtlüdeki pikseller arasındaki farklar alınarak hesaplanır. Örneğin, ddxdörtlüün sol tarafındaki piksellerdeki değerleri sağ taraftaki değerlerden ddyçıkaracak ve alt pikselleri en üstteki değerlerden çıkaracaktır. Farklılıklar daha sonra dörtlüdeki dört piksele de türev olarak döndürülebilir.

Piksel gölgelendirici SIMD'de çalıştığından, ilgili değerin dörtlüdeki tüm pikseller için aynı anda aynı kayıtta olması garanti edilir. Yani ne olursa olsun ifadesi veya konulan değer ddxveya ddyyukarıda açıklandığı gibi, bu dörtlü dört piksel değerlendirilecektir, daha sonra farklı piksel değerleri çıkarılır.

Yani sabit bir değerin türevini almak sıfır verir (matematikten beklediğiniz gibi, değil mi?) Çünkü dört pikselde de aynı sabit değerdir.

Ayrıca, "kaba" ve "ince" türevlerin ddx_coarse/ ddy_coarseve ddx_fine/ olduğunu unutmayın ddy_fine. Burada ayrımın açıklaması verilmiştir . Sadece düz ddx/ ddykaba sürümler için takma adlardır.

BTW, bu işlevselliğin var olmasının nedeni, GPU'ların mipmap seçimi ve anizotropik filtreleme yapmak için dahili olarak doku koordinatlarının türevlerini alması gerektiğidir. Donanım yine de yeteneğe ihtiyaç duyduğundan (gölgelendiricideki doku koordinatları için herhangi bir rastgele ifade kullanabilirsiniz), doğrudan gölgelendirici programcılarına maruz bırakmak da kolaydı.


+ 1; Bunu bir dokuya pertürbasyon etkisi uygularken faydalı buldum; bozulan texcoordlar bazı renk bozulmaları verdi, ancak orijinal (bozulmamış) texcoordlardan türevlerle tex2Dgrad kullanılması bozulmamış bir sonuç verdi.
Maximus Minimus

Tamam, bazı düşündükten sonra karışıklığımı çözdüğümü düşünüyorum. Benim düşünceme göre, ddxgeleneksel bir programlama dilinde diğer tüm işlevler gibi çalışır; girdiyi değerlendirir, bir kayan noktaya veya başka bir şeye çevirirseniz, dış işlevi ( ddx) yapın. Ancak bu farklıdır - girdi dizesini alır, birkaç yerde değerlendirir, bir türevi hesaplar ve sonucu rapor eder. Bu doğru mu?
Richard Rast

1
@RichardRast Doğru. Aklınıza gelebilecek ddxüzerinde çalışan olarak ifade seçmek yerine, onun içine geçmesine değeri .
Nathan Reed

Ama bakın, bu belgelerde olması yeterince garip. Programlama hayatımda durumun böyle olduğu başka bir zaman düşünemiyorum.
Richard Rast

Nathan Reed, GPU'ların mipmap seçimi için bu işlevleri kullandığını belirtti. Bunları, GPU'yu istenen bir mipmap düzeyini seçmeye zorlamak veya artefaktların yanlış mip düzeyi seçimini önlemek için de kullanabilirsiniz. İşlem, Shader X3'ün 163 ve 164. sayfalarında açıklanmaktadır.
JamesHoux
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.