Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Basamaklı gölge haritalar (CSM' ler) gölgelendirme ile en yaygın hatalardan biriyle mücadele etmenin en iyi yoludur: perspektif diğer adı. Okuyucunun gölge eşleme hakkında bilgi sahibi olduğunu varsayan bu teknik makale, CSM'ler konusunu ele alır. Özellikle, şu şekildedir:
- CSM'lerin karmaşıklığını açıklar;
- CSM algoritmalarının olası varyasyonlarının ayrıntılarını verir;
- en yaygın iki filtreleme tekniğini açıklar: yüzde yakın filtreleme (PCF) ve varyans gölge eşlemeleri (VSM) ile filtreleme);
- CSM'lere filtreleme eklemeyle ilişkili bazı yaygın tuzakları tanımlar ve giderir; ve
- CSM'lerin Direct3D 10 ile Direct3D 11 donanımları arasında nasıl eşlenmiş olduğunu gösterir.
Bu makalede kullanılan kod, CascadedShadowMaps11 ve VarianceShadows11 örneklerinde DirectX Yazılım Geliştirme Seti'nde (SDK) bulunabilir. Bu makale, Gölge Derinlik Haritalarını İyileştirmeye yönelik Yaygın Teknikler teknikler uygulandıktan sonra en yararlı olacaktır.
Basamaklı Gölge Haritalar ve Perspektif Diğer Adları
Gölge haritadaki perspektif diğer adı, aşılması en zor sorunlardan biridir. Teknik makalede, Gölge Derinliği Haritalarını Geliştirmek için Ortak Teknikler, perspektif diğer adları açıklanmış ve sorunu hafifletmeye yönelik bazı yaklaşımlar tanımlanmıştır. Pratikte, CSM'ler en iyi çözüm olma eğilimindedir ve yaygın olarak modern oyunlarda kullanılır.
CSM'lerin temel kavramını anlamak kolaydır. Kamera frustumunun farklı alanları farklı çözünürlüklere sahip gölge haritalar gerektirir. Göze en yakın nesneler, daha uzak nesnelere kıyasla daha yüksek bir çözünürlük gerektirir. Aslında, göz geometriye çok yakın hareket ettiğinde, göze en yakın pikseller o kadar çok çözünürlük gerektirebilir ki 4096 × 4096 gölge haritası bile yetersiz kalır.
CSM'lerin temel fikri frustum'un birden çok frustaya bölünmesini sağlamaktır. Her altfrustum için bir gölge harita işlenir; piksel gölgelendiricisi daha sonra haritadaki gerekli çözünürlükle en yakından eşleşen örneklerdir (Şekil 2).
Şekil 1. Gölge harita kapsamı
gölge harita kapsamı
Şekil 1'de kalite en yüksekten en düşüğe doğru gösterilir (soldan sağa). Görünüm frustumlu gölge haritaları temsil eden kılavuz serisi (kırmızı renkli ters koni), piksel kapsamının farklı çözünürlük gölge haritalarından nasıl etkilendiğini gösterir. Gölgeler, açık alanda pikselleri gölge haritadaki ifadelere 1:1 oranında eşlediğinde en yüksek kalitededir (beyaz piksel). Perspektif diğer adı, aynı gölge ifadeye çok fazla piksel eşlendiğinde büyük, bloklu doku eşlemeleri (sol görüntü) biçiminde gerçekleşir. Gölge harita çok büyük olduğunda, örneklenmiş olur. Bu durumda, ifadeler atlanır, parlayan yapıtlar ortaya konur ve performans etkilenir.
Şekil 2. CSM gölge kalitesi
csm gölge kalitesi
Şekil 2'de, Şekil 1'deki her gölge haritadaki en yüksek kalite bölümünden yapılan kesimler gösterilmektedir. En yakın yerleştirilmiş piksellere (tepe noktasında) sahip gölge harita en yakın gözdür. Teknik olarak, bunlar aynı boyutta haritalardır ve basamaklı gölge haritanın başarısını göstermek için kullanılan beyaz ve gridir. Beyaz, iyi bir kapsam gösterdiği için idealdir; göz boşluğu pikselleri ve gölge haritası ifadeleri için 1:1 oranı.
CSM'ler çerçeve başına aşağıdaki adımları gerektirir.
Frustum'un altfrusta olarak bölümlemesi.
Her altfrustum için bir ortografik projeksiyon hesaplama.
Her altfrustum için bir gölge harita oluşturun.
Sahneyi işleme.
Gölge haritaları bağlama ve işleme.
Köşe gölgelendiricisi aşağıdakileri yapar:
- Her ışık alt kütüğü için doku koordinatlarını hesaplar (gerekli doku koordinatı piksel gölgelendiricisinde hesaplanmadığı sürece).
- Köşeyi dönüştürür ve aydınlatır, vb.
Piksel gölgelendiricisi aşağıdakileri yapar:
- Uygun gölge haritayı belirler.
- Gerekirse doku koordinatlarını dönüştürür.
- Art arda örnekleri.
- Pikseli aydınlatın.
Frustum Bölümleme
Frustum bölümleme subfrusta oluşturma eylemidir. Frustum bölmek için kullanılan bir teknik, Z yönünde yüzde sıfırdan yüzde yüze kadar olan aralıkları hesaplamaktır. Her aralık daha sonra Z ekseninin yüzdesi olarak yakın bir düzlemi ve uzak düzlemi temsil eder.
Şekil 3. Rastgele bölümlenmiş frustumları görüntüleme
Uygulamada, çerçeve başına frustum bölmelerinin yeniden hesaplanması gölge kenarların parıltılı hale getirmesine neden olur. Genel olarak kabul edilen uygulama, senaryo başına statik bir art arda aralık kümesi kullanmaktır. Bu senaryoda, Z ekseni boyunca olan aralık, frustum bölümlendiğinde oluşan bir alt kütüğü tanımlamak için kullanılır. Belirli bir sahne için doğru boyut aralıklarının belirlenmesi birkaç faktöre bağlıdır.
Sahne Geometrisinin Yönü
Sahne geometrisi bakımından kamera yönü art arda aralık seçimini etkiler. Örneğin, futbol maçındaki zemin kamerası gibi yere çok yakın bir kamera, gökyüzündeki bir kameradan farklı statik basamaklı aralıklara sahiptir.
Şekil 4'de bazı farklı kameralar ve ilgili bölümleri gösterilmektedir. Sahnenin Z aralığı çok büyük olduğunda, daha fazla bölünmüş düzlem gerekir. Örneğin, göz zemin düzleminin çok yakınındayken, ancak uzak nesneler hala görünür olduğunda, birden çok basamak gerekli olabilir. Daha fazla bölmenin göze yakın olması için frustum bölünmesi (perspektif diğer adının en hızlı şekilde değiştirildiği yer) de değerlidir. Geometrinin çoğu görünüm frustumunun küçük bir bölümüne (ek yük görünümü veya uçuş simülatörü gibi) dahil edildiğinde, daha az basamak gerekir.
Şekil 4. Farklı yapılandırmalar farklı frustum bölmeleri gerektirir
gerekir
(Sol) Geometrinin Z'de yüksek dinamik aralığı olduğunda, çok sayıda basamak gereklidir. (Ortala) Geometrinin Z'de düşük dinamik aralığı olduğunda, birden çok frustumdan çok az yarar vardır. (Sağ) Dinamik aralık orta olduğunda yalnızca üç bölüm gerekir.
Işığın ve Kameranın Yönü
Her basamaklının projeksiyon matrisi, karşılık gelen altfrustumun etrafına sıkı bir şekilde sığar. Kamera ve ışık yönlerinin ortogonal olduğu yapılandırmalarda basamaklar küçük çakışmalarla sıkı bir şekilde sığabilir. Işık ve görünüm kamerası paralel hizalamaya geçtikçe çakışma büyür (Şekil 5). Işık ve görüş kamerası neredeyse paralel olduğunda, buna "düello frusta" denir ve çoğu gölgeleme algoritması için çok zor bir senaryodur. Bu senaryonun gerçekleşmemesi için ışığı ve kamerayı kısıtlamak yaygın bir durum değildir. Ancak CSM'ler bu senaryoda diğer birçok algoritmadan çok daha iyi performans gösterir.
Şekil 5. Işık yönü kamera yönüyle paralel hale geldikçe art arda örtüşme artar
işık yönü kamera yönüyle paralel hale geldikçe
Birçok CSM uygulaması sabit boyutlu frusta kullanır. Piksel gölgelendiricisi, frustum sabit boyutlu aralıklarla bölündüğünde basamak dizisinde dizin oluşturmak için Z derinliğini kullanabilir.
View-Frustum İlişkili Hesaplama
Frustum aralıkları seçildikten sonra, altfrusta ikiden biri kullanılarak oluşturulur: görünüme sığdır ve art arda sığdır.
Görünüme Sığdır
Tüm frusta aynı yakın düzlem ile oluşturulabilir. Bu, basamaklıları çakışmaya zorlar. CascadedShadowMaps11 örneği bu tekniği sahne için uygun olarak çağırır.
Art Arda Sığdır
Alternatif olarak, gerçek bölüm aralığı yakın ve uzak düzlemler olarak kullanıldığında frusta oluşturulabilir. Bu daha sıkı bir uyuma neden olur, ancak dueling frusta durumunda sahne için dejenere olur. CascadedShadowMaps11 örnekleri bu tekniği art arda uyacak şekilde çağırır.
Bu iki yöntem Şekil 6'da gösterilmiştir. Daha az çözünürlükte atıkları art arda eklemek için uygundur. Art arda sığdırma sorunu, ortografik projeksiyonun görünüm frustumunun yönüne göre büyümesi ve küçülmesidir. Görünüme sığdır tekniği, görünüm frustumunun maksimum boyutuna göre ortografik projeksiyonu tuş takımına yerleştirerek, görünüm kamerası hareket ettiğinde görüntülenen yapıtları kaldırır. Gölge Derinliği Haritalarını İyileştirmeye yönelik Yaygın Teknikler ışık "Işığın açık boyutlu artışlarla taşınması" bölümünde hareket ettiğinde görüntülenen yapıtları ele alır.
Şekil 6. Sahne için sığdır ve basamakla sığdır
sığdırma
Gölge Haritayı İşleme
CascadedShadowMaps11 örneği, gölge haritaları tek bir büyük arabellekte işler. Bunun nedeni doku dizilerindeki PCF'nin direct3D 10.1 özelliği olmasıdır. Her basamak için, bu basamaklıya karşılık gelen derinlik arabelleğinin bölümünü kapsayan bir görünüm penceresi oluşturulur. Yalnızca derinlik gerekli olduğundan null piksel gölgelendiricisi bağlıdır. Son olarak, derinlik haritaları ana gölge arabelleğe birer birer işlendiği için her basamak için doğru görünüm penceresi ve gölge matris ayarlanır.
Sahneyi İşleme
Gölgeleri içeren arabellek artık piksel gölgelendiricisine bağlıdır. CascadedShadowMaps11 örneğinde uygulanan basamakları seçmek için iki yöntem vardır. Bu iki yöntem gölgelendirici koduyla açıklanmıştır.
Seçimi Art Arda Interval-Based
Şekil 7. Aralık tabanlı art arda seçim
Aralık tabanlı art arda seçim
Aralık tabanlı seçimde (Şekil 7), köşe gölgelendiricisi köşenin dünya uzayı içindeki konumunu hesaplar.
Output.vDepth = mul( Input.vPosition, m_mWorldView ).z;
Piksel gölgelendiricisi ilişkilendirilmiş derinliği alır.
fCurrentPixelDepth = Input.vDepth;
Aralık tabanlı art arda seçim, doğru kakayı belirlemek için vektör karşılaştırması ve noktalı bir ürün kullanır. CASCADE_COUNT_FLAG basamak sayısını belirtir. m_fCascadeFrustumsEyeSpaceDepths_data görünüm frustum bölümlerini kısıtlar. Karşılaştırmadan sonra fComparison, geçerli pikselin bariyerden daha büyük olduğu 1 değerini ve geçerli basamak daha küçük olduğunda 0 değerini içerir. Noktalı bir ürün bu değerleri bir dizi dizininde toplar.
float4 vCurrentPixelDepth = Input.vDepth;
float4 fComparison = ( vCurrentPixelDepth > m_fCascadeFrustumsEyeSpaceDepths_data[0]);
float fIndex = dot(
float4( CASCADE_COUNT_FLAG > 0,
CASCADE_COUNT_FLAG > 1,
CASCADE_COUNT_FLAG > 2,
CASCADE_COUNT_FLAG > 3)
, fComparison );
fIndex = min( fIndex, CASCADE_COUNT_FLAG );
iCurrentCascadeIndex = (int)fIndex;
Basamak seçildikten sonra doku koordinatı doğru basamaklara dönüştürülmelidir.
vShadowTexCoord = mul( InterpolatedPosition, m_mShadow[iCascadeIndex] );
Bu doku koordinatı daha sonra X koordinatı ve Y koordinatı ile dokuyu örneklemek için kullanılır. Z koordinatı, son derinlik karşılaştırmasını yapmak için kullanılır.
Seçimi Art Arda Map-Based
Harita tabanlı seçim (Şekil 8) belirli bir pikseli kapsayan en sıkı haritayı bulmak için basamakların dört tarafında test eder. Köşe gölgelendiricisi, dünya uzayı içindeki konumu hesaplamak yerine her basamak için görünüm alanı konumunu hesaplar. Piksel gölgelendiricisi, geçerli art arda dizine eklenebilmesi için doku koordinatlarını ölçeklendirmek ve kaydırmak için basamaklar üzerinde yinelenir. Doku koordinatı daha sonra doku sınırlarına göre test edilir. Doku koordinatının X ve Y değerleri art arda geldiğinde, dokuyu örneklemek için kullanılır. Z koordinatı, son derinlik karşılaştırmasını yapmak için kullanılır.
Şekil 8. Harita tabanlı art arda seçim
harita tabanlı art arda seçim
seçimi Interval-Based ve Map-Based Seçimi karşılaştırması
Art arda seçim doğrudan yapılabildiğinden aralık tabanlı seçim, harita tabanlı seçimden biraz daha hızlıdır. Harita tabanlı seçim, doku koordinatını art arda sınırlarıyla kesiştirmelidir.
Harita tabanlı seçim, gölge haritalar mükemmel hizalanmadığında art arda daha verimli bir şekilde kullanır (bkz. Şekil 8).
Cascades arasında harmanlama
VSM'ler (bu makalenin ilerleyen bölümlerinde ele alınmalıdır) ve PCF gibi filtreleme teknikleri, yumuşak gölgeler oluşturmak için düşük çözünürlüklü CSM'lerle kullanılabilir. Ne yazık ki bu, çözünürlük eşleşmediğinden art arda katmanlar arasında görünür bir dikiş (Şekil 9) ile sonuçlanabilir. Çözüm, her iki basamaklı için gölge testinin gerçekleştirildiği gölge haritalar arasında bir bant oluşturmaktır. Ardından gölgelendirici, pikselin blend bandındaki konumuna göre iki değer arasında doğrusal olarak ilişkilendirme sağlar. CascadedShadowMaps11 ve VarianceShadows11 örnekleri, bu bulanıklaştırma bandını artırmak ve azaltmak için kullanılabilecek bir GUI kaydırıcısı sağlar. Gölgelendirici dinamik bir dal gerçekleştirerek piksellerin büyük çoğunluğunun yalnızca geçerli art arda okumasını sağlar.
Şekil 9. Art arda dikişler
(Sol) Basamaklıların çakıştığı görünür bir dikiş görülebilir. (Sağ) Basamaklar arasında karıştırıldığında, dikiş gerçekleşmez.
Gölge Haritaları Filtreleme
PCF
Normal gölge haritalarının filtrelenmesi yumuşak, bulanık gölgeler üretmez. Filtreleme donanımı derinlik değerlerini bulanıklaştırır ve ardından bu bulanık değerleri açık alan açıklığıyla karşılaştırır. Başarılı/başarısız testinden kaynaklanan sabit kenar hala var. Bulanık gölge haritalar yalnızca hatalı bir şekilde sabit kenarı hareket ettirmeye hizmet eder. PCF, gölge haritalarda filtrelemeyi etkinleştirir. PCF'nin genel fikri, derinlik testini toplam alt örnek sayısı üzerinden geçen alt örnek sayısına göre gölgedeki pikselin yüzdesini hesaplamaktır.
Direct3D 10 ve Direct3D 11 donanımları PCF gerçekleştirebilir. PCF örnekleyiciye giriş doku koordinatı ve karşılaştırma derinliği değerinden oluşur. Kolaylık olması için, PCF dört dokunmalı bir filtre ile açıklanmıştır. Doku örnekleyici, standart filtreye benzer şekilde dokuyu dört kez okur. Ancak, döndürülen sonuç derinlik testini geçen piksellerin yüzdesidir. Şekil 10'da dört derinlik testlerinden birini geçen bir pikselin gölgede yüzde 25 olduğu gösterilmektedir. Döndürülen gerçek değer, düzgün bir gradyan oluşturmak için doku okumalarının alt köşe koordinatlarını temel alan doğrusal bir ilişkilendirmedir. Bu doğrusal ilişkilendirme olmadan, dört dokunmalı PCF yalnızca beş değer döndürebildi: { 0,0, 0,25, 0,5, 0,75, 1,0 }.
Şekil 10. Seçili pikselin yüzde 25'inin kapsandığı PCF filtrelenmiş görüntüsü
Seçili pikselin yüzde 25'inin kapsandığı pcf filtreli görüntüyü
Donanım desteği olmadan PCF yapmak veya PCF'yi daha büyük çekirdeklere genişletmek de mümkündür. Bazı teknikler bile ağırlıklı çekirdekle örneklenmiştir. Bunu yapmak için N × N kılavuzu için bir çekirdek (Gaussian gibi) oluşturun. Ağırlıklar en fazla 1 olmalıdır. Doku daha sonra N2 kez örneklendirilir. Her örnek, çekirdekteki ilgili ağırlıklara göre ölçeklendirilir. CascadedShadowMaps11 örneği bu yaklaşımı kullanır.
Derinlik Yanlılık
Büyük PCF çekirdekleri kullanıldığında derinlik sapmaları daha da önemli hale gelir. Yalnızca bir pikselin ışık alanı derinliğini derinlik haritasında eşlediğinden pikselle karşılaştırmak geçerlidir. Derinlik haritası texel'in komşuları farklı bir konuma başvurur. Bu derinlik benzer olabilir, ancak görünüme bağlı olarak çok farklı olabilir. Şekil 11'de oluşan yapıtlar vurgulanır. Tek bir derinlik, gölge haritadaki üç komşu texel ile karşılaştırılır. Derinlik testlerinden biri, derinliği geçerli geometrinin hesaplanan ışık alanı derinliğiyle bağıntılı olmadığından hatalı bir şekilde başarısız olur. Bu sorunun önerilen çözümü daha büyük bir uzaklık kullanmaktır. Öte yandan uzaklık çok büyükse, Peter Panning'e neden olabilir. Yakın düzlem ve uzak düzlemin hesaplanması, uzaklık kullanmanın etkilerini azaltmaya yardımcı olur.
Şekil 11. Hatalı kendi kendine gölgeleme
Hatalı kendi kendine gölgeleme, ışık alanı derinliğindeki piksellerin gölge haritadaki bağıntısız ifadelerle karşılaştırılmasından kaynaklanıyor. Işık uzayı derinliği, derinlik haritasında gölge texel 2 ile ilişkilidir. Texel 1, ışık uzay derinliğinden daha büyükken 2 eşittir ve 3 daha azdır. Texels 2 ve 3 derinlik testini geçerken, Texel 1 başarısız olur.
Büyük PCF'ler için DDX ve DDY ile Per-Texel Derinlik Sapmasını Hesaplama
Büyük PC'ler için ddx ve ddy ile texel başına derinlik sapmasını hesaplamak, yüzey planlı olduğu varsayılarak, bitişik gölge haritası texel için doğru derinlik sapmasını hesaplayan bir tekniktir.
Bu teknik, türev bilgileri kullanarak bir düzlemle karşılaştırma derinliğine uygundur. Bu teknik hesaplama açısından karmaşık olduğundan, yalnızca GPU'nun yedeklenecek işlem döngüleri olduğunda kullanılmalıdır. Çok büyük çekirdekler kullanıldığında, Peter Panning'e neden olmadan kendi kendine gölgelendirme yapıtlarını kaldırmak için çalışan tek teknik bu olabilir.
Şekil 12'de sorun vurgulanır. Işık uzayı derinliği, karşılaştırılan tek texel ile bilinir. Derinlik haritasındaki komşu texel'lere karşılık gelen ışık uzayı derinlikleri bilinmiyor.
Şekil 12. Sahne ve derinlik haritası
İşlenen sahne solda gösterilir ve örnek bir texel bloğu içeren derinlik haritası sağda gösterilir. Göz uzayı texel, bloğun ortasındaki D etiketli pikselle eşler. Bu karşılaştırma doğrudur. D komşusunun pikselleri ile ilişkili doğru göz boşluğu derinliği bilinmiyor. Yalnızca pikselin D ile aynı üçgenle ilgili olduğunu varsayarsak, komşu texel'leri göz boşluğuna geri eşlemek mümkündür.
Derinlik, açık uzay konumuyla bağıntılı olan texel ile bilinir. Derinlik haritasındaki komşu texel'ler için derinlik bilinmiyor.
Bu teknik, ddx ve ddy HLSL işlemlerini kullanarak ışık uzayı konumunun türevini bulur. Türev işlemleri, ışık uzayı derinliğinin gradyanını ekran alanına göre döndüreceği için bu önemsiz bir durumdur. Bunu ışık alanı derinliğinin ışık alanına göre gradyanlarına dönüştürmek için bir dönüştürme matrisinin hesaplanması gerekir.
Gölgelendirici Kodu ile açıklama
Algoritmanın geri kalanının ayrıntıları, bu işlemi gerçekleştiren gölgelendirici kodunun açıklaması olarak verilir. Bu kod CascadedShadowMaps11 örneğinde bulunabilir. Şekil 13'te ışık uzayı doku koordinatlarının derinlik haritasına nasıl eşileceği ve X ve Y'deki türevlerin dönüşüm matrisi oluşturmak için nasıl kullanılabileceğini gösterilmiştir.
Şekil 13. Ekran alanından açık alan matrisine
Açık alan matrisine ekran alanını
X ve Y'deki ışık uzayı pozisyonunun türevleri bu matrisi oluşturmak için kullanılır.
İlk adım, ışık-görüş-uzay pozisyonunun türevini hesaplamaktır.
float3 vShadowTexDDX = ddx (vShadowMapTextureCoordViewSpace);
float3 vShadowTexDDY = ddy (vShadowMapTextureCoordViewSpace);
Direct3D 11 sınıf GPU'lar, paralel olarak 2 × 2 dört piksel çalıştırarak ve doku koordinatlarını X'te ddx için komşudan ve ddyiçin Y'deki komşudan çıkararak bu türevleri hesaplar. Bu iki türev, 2 × 2 matrisin satırlarını oluşturur. Bu matris, geçerli biçiminde, ekran boşluğuna komşu pikselleri açık alan eğimlerine dönüştürmek için kullanılabilir. Ancak, bu matrisin tersi gereklidir. Açık alana komşu pikselleri ekran boşluğu eğimlerine dönüştüren bir matris gereklidir.
float2x2 matScreentoShadow = float2x2( vShadowTexDDX.xy, vShadowTexDDY.xy );
float fInvDeterminant = 1.0f / fDeterminant;
float2x2 matShadowToScreen = float2x2 (
matScreentoShadow._22 * fInvDeterminant,
matScreentoShadow._12 * -fInvDeterminant,
matScreentoShadow._21 * -fInvDeterminant,
matScreentoShadow._11 * fInvDeterminant );
Şekil 14. Açık alandan ekran alanına
Ekran alanına ışık alanı
Bu matris daha sonra geçerli ifadenin üzerindeki ve sağındaki iki ifadeyi dönüştürmek için kullanılır. Bu komşular geçerli texel'den uzaklık olarak temsil edilir.
float2 vRightShadowTexelLocation = float2( m_fTexelSize, 0.0f );
float2 vUpShadowTexelLocation = float2( 0.0f, m_fTexelSize );
float2 vRightTexelDepthRatio = mul( vRightShadowTexelLocation,
matShadowToScreen );
float2 vUpTexelDepthRatio = mul( vUpShadowTexelLocation,
matShadowToScreen );
Matrisin oluşturduğu oran son olarak, komşu piksellerin derinlik uzaklıklarını hesaplamak için derinlik türevleriyle çarpılır.
float fUpTexelDepthDelta =
vUpTexelDepthRatio.x * vShadowTexDDX.z
+ vUpTexelDepthRatio.y * vShadowTexDDY.z;
float fRightTexelDepthDelta =
vRightTexelDepthRatio.x * vShadowTexDDX.z
+ vRightTexelDepthRatio.y * vShadowTexDDY.z;
Bu ağırlıklar artık konuma uzaklık eklemek için bir PCF döngüsünde kullanılabilir.
for( int x = m_iPCFBlurForLoopStart; x < m_iPCFBlurForLoopEnd; ++x )
{
for( int y = m_iPCFBlurForLoopStart; y < m_iPCFBlurForLoopEnd; ++y )
{
if ( USE_DERIVATIVES_FOR_DEPTH_OFFSET_FLAG )
{
depthcompare += fRightTexelDepthDelta * ( (float) x ) +
fUpTexelDepthDelta * ( (float) y );
}
// Compare the transformed pixel depth to the depth read
// from the map.
fPercentLit += g_txShadow.SampleCmpLevelZero( g_samShadow,
float2(
vShadowTexCoord.x + ( ( (float) x ) * m_fNativeTexelSizeInX ) ,
vShadowTexCoord.y + ( ( (float) y ) * m_fTexelSize )
),
depthcompare
);
}
}
PCF ve CSM'ler
PCF, Direct3D 10'daki doku dizilerinde çalışmaz. PCF kullanmak için tüm basamaklar tek bir büyük doku atlasında depolanır.
Derivative-Based Uzaklığı
CSM'ler için türev tabanlı uzaklıkların eklenmesi bazı zorluklara neden olur. Bunun nedeni, farklı akış denetimindeki türev hesaplamalarıdır. Sorun, GPU'ların temel bir şekilde çalışması nedeniyle oluşur. Direct3D11 GPU'ları 2 × 2 dört piksel üzerinde çalışır. Bir türev gerçekleştirmek için GPU'lar genellikle bir değişkenin geçerli piksel kopyasını komşu pikselin aynı değişkenin kopyasından çıkarır. Bunun nasıl olduğu GPU'dan GPU'ya değişir. Doku koordinatları harita tabanlı veya aralık tabanlı art arda seçimle belirlenir. Piksel dörtlüsünün bazı pikselleri, piksellerin geri kalanından farklı bir basamak seçer. Bu, türev tabanlı uzaklıklar artık tamamen yanlış olduğundan gölge haritalar arasında görünür dikişlerle sonuçlanıyor. Çözüm, türevi ışık görüş alanı doku koordinatlarında gerçekleştirmektir. Bu koordinatlar her basamak için aynıdır.
PCF Çekirdekleri için Doldurma
Gölge arabelleğe doldurulmadıysa, PCF çekirdekleri dizini art arda bölümün dışında kalır. Çözüm, basamaklamanın dış kenarını PCF çekirdeğinin yarısı kadar kaplamaktır. Bu, art arda gelenleri seçen gölgelendiricide ve kenarlığı korunacak kadar büyük işlemesi gereken projeksiyon matrisinde uygulanmalıdır.
Varyans Gölge Haritalar
VSM'ler (daha fazla bilgi için bkz. Donnelly ve Lauritzen tarafından Varyans gölge haritaları) doğrudan gölge harita filtrelemeyi etkinleştirir. VSM'ler kullanılırken doku filtreleme donanımının tüm gücü kullanılabilir. Trilineer ve anisotropik (Şekil 15) filtreleme kullanılabilir. Ayrıca, VSM'ler doğrudan convolution aracılığıyla bulanıklaştırılabilir. VSM'lerin bazı dezavantajları vardır; derinlik verilerinin iki kanalı depolanmalıdır (derinlik ve derinlik karesi). Gölgeler çakıştığında ışık kanaması sık görülür. Ancak, daha düşük çözünürlüklerle iyi çalışırlar ve CSM'lerle birleştirilebilirler.
Şekil 15. Anisotropik filtreleme
Algoritma Ayrıntıları
VSM'ler derinliği ve derinliği iki kanallı bir gölge eşlem olarak işleyerek çalışır. Bu iki kanallı gölge harita daha sonra bulanıklaştırılabilir ve normal bir doku gibi filtrelenebilir. Ardından algoritma, derinlik testini geçebilecek piksel alanının kesirini tahmin etmek için piksel gölgelendiricisindeki Çebiçev'in Eşitsizliğini kullanır.
Piksel gölgelendiricisi derinlik ve derinlik karesi değerlerini getirir.
float fAvgZ = mapDepth.x; // Filtered z
float fAvgZ2 = mapDepth.y; // Filtered z-squared
Derinlik karşılaştırması gerçekleştirilir.
if ( fDepth <= fAvgZ )
{
fPercentLit = 1;
}
Derinlik karşılaştırması başarısız olursa, yanan piksel yüzdesi tahmin edilir. Varyans, ortalama kareler eksi ortalama karesi olarak hesaplanır.
float variance = ( fAvgZ2 ) − ( fAvgZ * fAvgZ );
variance = min( 1.0f, max( 0.0f, variance + 0.00001f ) );
fPercentLit değeri Çebiçev'in Eşitsizlik değeriyle tahmin edilir.
float mean = fAvgZ;
float d = fDepth - mean;
float fPercentLit = variance / ( variance + d*d );
Işık Kanaması
VSM'lerin en büyük dezavantajı ışık kanamasıdır (Şekil 16). Işık kanaması, birden fazla gölge tekerlek kenar boyunca birbirini tıkadığında ortaya çıkar. VSM'ler, derinlik ayrımlarına göre gölgelerin kenarlarını gölgeler. Gölgeler birbiriyle çakıştığında, gölgeli olması gereken bir bölgenin merkezinde bir derinlik ayrılığı vardır. Bu, VSM algoritmasının kullanılmasıyla ilgili bir sorundur.
Şekil 16. VSM ışık kanaması
Sorunun kısmi bir çözümü fPercentLit'i bir güce yükseltmektir. Bu, bulanıklığı sönümleme etkisine sahiptir ve bu da derinlik ayrılığının küçük olduğu yapıtlara neden olabilir. Bazen sorunu hafifleten sihirli bir değer vardır.
fPercentLit = pow( p_max, MAGIC_NUMBER );
Yanan yüzdeyi bir güce yükseltmenin bir alternatifi, gölgelerin çakıştığı yapılandırmalardan kaçınmaktır. Yüksek oranda ayarlanmış gölge yapılandırmaları bile ışık, kamera ve geometri üzerinde çeşitli kısıtlamalara sahiptir. Daha yüksek çözünürlüklü dokular kullanılarak ışık kanaması da azalır.
Katmanlı varyans gölge haritaları (LVSM'ler), frustum'un ışığa dik katmanlara bölünmesi pahasına sorunu çözer. CSM'ler de kullanılırken gereken harita sayısı oldukça fazla olacaktır.
Buna ek olarak, VSM'ler makalesinin ortak yazarı ve LVSM'ler üzerine bir makalenin yazarı olan Andrew Lauritzen, üstel gölge haritaları (ESM)'leri VSM'lerle birleştirerek bir Beyond3D Forum...
CSM'leri olan VSM'ler
Örnek VarianceShadow11, VSM'leri ve CSM'leri birleştirir. Kombinasyon oldukça basittir. Örnek, CascadedShadowMaps11 örneğiyle aynı adımları izler. PCF kullanılmadığından, gölgeler iki geçişli ayrıştırılabilir bir konvolüsyonda bulanıklaşır. PCF kullanılmaması, örneğin doku atlası yerine doku dizilerini kullanmasını da sağlar. Doku dizilerinde PCF bir Direct3D 10.1 özelliğidir.
CSM'ler ile gradyanlar
CSM'lerle gradyanların kullanılması, Şekil 17'de görüldüğü gibi iki basamak arasındaki kenarlık boyunca bir dikiş oluşturabilir. Örnek yönerge, filtrenin gerektirdiği mipmap düzeyi gibi bilgileri hesaplamak için pikseller arasındaki türevleri kullanır. Bu, özellikle mipmap seçiminde veya anisotropik filtrelemede bir soruna neden olur. Dörtlüdeki pikseller gölgelendiricide farklı dallara sahip olduğunda, GPU donanımı tarafından hesaplanan türevler geçersiz olur. Bu, gölge harita boyunca pürüzlü bir dikişle sonuçlanabilir.
Şekil 17. İlişkili akış denetimi ile anizotropik filtreleme nedeniyle art arda kenarlıklardaki dikişler
nedeniyle art arda kenarlıklarda dikişler
Bu sorun, türevlerin ışık görüş alanında konumları hesaplanarak çözülür; açık görüş alanı koordinatı seçili basamaklama için özel değildir. Hesaplanan türevler, projeksiyon-doku matrisinin ölçek bölümü tarafından doğru mipmap düzeyine ölçeklendirilebilir.
float3 vShadowTexCoordDDX = ddx( vShadowMapTextureCoordViewSpace );
vShadowTexCoordDDX *= m_vCascadeScale[iCascade].xyz;
float3 vShadowTexCoordDDY = ddy( vShadowMapTextureCoordViewSpace );
vShadowTexCoordDDY *= m_vCascadeScale[iCascade].xyz;
mapDepth += g_txShadow.SampleGrad( g_samShadow, vShadowTexCoord.xyz,
vShadowTexCoordDDX, vShadowTexCoordDDY );
VSM'ler PCF ile Standart Gölgelerle Karşılaştırıldığında
Hem VSM'ler hem de PCF, derinlik testini geçebilecek piksel alanının yaklaşık kesirini dener. VSM'ler filtreleme donanımıyla çalışır ve ayrıştırılabilir çekirdeklerle bulanıklaştırılabilir. Ayrıştırılabilir konvolüsyon çekirdeklerinin uygulanması, tam çekirdekten çok daha ucuza gelir. Buna ek olarak, VSM'ler bir ışık alanı derinliğini ışık alanı derinlik haritasındaki bir değerle karşılaştırır. Bu, VSM'lerin PCF ile aynı uzaklık sorunlarına sahip olmadığı anlamına gelir. Teknik olarak VSM'ler daha büyük bir alan üzerinde örnekleme derinliğine sahip olup istatistiksel analiz gerçekleştirmektedir. Bu, PCF'den daha az kesindir. Uygulamada, VSM'ler çok iyi bir karıştırma işi yapar ve bu da daha az uzaklık gerekli olmasına neden olur. Yukarıda açıklandığı gibi, VSM'lerin bir numaralı dezavantajı hafif kanamadır.
VSM'ler ve PCF, GPU işlem gücü ile GPU doku bant genişliği arasındaki dengeyi temsil eder. VSM'lerin varyansı hesaplamak için daha fazla matematik işlemi yapılması gerekir. PCF için daha fazla doku bellek bant genişliği gerekir. Büyük PCF çekirdekleri doku bant genişliğiyle hızla performans sorununa neden olabilir. GPU hesaplama gücü GPU bant genişliğine göre daha hızlı arttıkça, VSM'ler iki algoritmanın daha pratik hale geliyor. Karıştırma ve filtreleme nedeniyle VSM'ler daha düşük çözünürlüklü gölge haritalarıyla da daha iyi görünür.
Özet
CSM'ler perspektif diğer ad sorununa bir çözüm sunar. Bir başlık için gerekli görsel uygunluğu elde etmek için birkaç olası yapılandırma vardır. PCF ve VSM'ler yaygın olarak kullanılır ve diğer adları azaltmak için CSM'lerle birleştirilmelidir.
Başvuru
Donnelly, W. and Lauritzen, A. Varyans gölge haritaları. In SI3D '06: Proceedings of the 2006 symposium on Interactive 3D graphics and games. 2006. s. 161-165. New York, NY, ABD: ACM Press.
Lauritzen, Andrew ve McCool, Michael. Katmanlı varyans gölgesieşler. Proceedings of graphics interface 2008, May 28–30, 2008, Windsor, Ontario, Canada.
Engel, Woflgang F. Bölüm 4. Basamaklı Gölge Haritalar. ShaderX5 , Advanced Rendering Techniques, Wolfgang F. Engel, Ed. Charles River Medya, Boston, Massachusetts. 2006. ss. 197–206.