Şablon tamponu - Stencil buffer

Bu görüntüde, şablon arabelleğinde sırasıyla 1'leri ve 0ları temsil eden beyaz bölgeler ve siyah bölgeler vardır. Şekiller daha sonra şablon arabelleğinin değeri tersine çevrilerek şeritlerin üstüne çizilir. Bu pikseldeki arabellek 0 (siyah) değerine sahipse, pikseli beyaza (1) renklendirin ve tersini yapın.

Bir şablon tampon ekstra mı veri arabelleği, buna ek olarak renk arabelleği ve Z tampon, modernde bulundu grafik donanımı. Arabellek piksel başınadır ve tamsayı değerler, genellikle bir derinlikte bayt piksel başına. Z tampon ve şablon arabelleği genellikle aynı alanı paylaşır Veri deposu grafik donanımı.

En basit durumda, şablon arabelleği, alanın alanını sınırlamak için kullanılır. işleme (şablon). Şablon arabelleğinin daha gelişmiş kullanımı, Z-arabelleği ile şablon arabelleği arasındaki güçlü bağlantıyı kullanır. işleme hattı. Örneğin, şablon değerleri, derinlik testini geçemeyen veya geçen her piksel için otomatik olarak artırılabilir / azaltılabilir.

Derinlik testi ve şablon değiştiricilerin basit kombinasyonu, çok sayıda etkiyi mümkün kılar (şablon gölge ciltler, İki Taraflı Şablon,[1] Birleştirme, çıkartma, çözülme, kaybolma, hızlıca kaydırma, silüetler, ana hat çizme veya karmaşık arasındaki kesişme noktalarının vurgulanması ilkeller ), ancak genellikle birkaç oluşturma geçişi gerektirmelerine ve bu nedenle grafik donanımına ağır bir yük bindirmelerine rağmen.

En tipik uygulama hala gölgeler eklemektir. 3D uygulamalar. Aynı zamanda düzlemsel yansımalar için de kullanılır.

Gibi diğer oluşturma teknikleri portal oluşturma şablon arabelleğini başka şekillerde kullanın; örneğin, bir portal tarafından kapatılan ekran alanını bulmak ve bu pikselleri doğru şekilde yeniden oluşturmak için kullanılabilir.

Şablon arabelleği ve onun değiştiricilerine bilgisayar grafiklerinden erişilebilir. API'ler sevmek OpenGL, Direct3D veya Vulkan.

Mimari

Şablon arabelleği tipik olarak Z-arabelleği ile aynı bellek alanını paylaşır ve tipik olarak oran, Z-arabelleği için 24 bit + şablon arabelleği için 8 bit veya geçmişte Z-arabelleği için 15 bit + şablon arabelleği için 1 bittir . Başka bir varyant 4 + 24'tür, burada 32 bitten 28'i kullanılır ve 4'ü yok sayılır. Şablon ve Z-tamponları, renk tamponuna bağlı çerçeve tamponunun bir parçasıdır. Daha geniş bir pazarda bulunan ilk çip, bir bitlik şablon arabelleğini destekleyen 3Dlabs'ın Permedia II'siydi.

Şablon arabelleğine tahsis edilen bitler, [0, 2 aralığındaki sayısal değerleri temsil etmek için kullanılabilir.n-1] ve ayrıca bir Boolean matrisi olarak (n, tahsis edilen bitlerin sayısıdır), her biri sahnenin belirli bir bölümünü kontrol etmek için kullanılabilir. Mevcut hafızayı kullanmanın bu iki yolunun herhangi bir kombinasyonu da mümkündür.

Şablon testi

Şablon testi veya şablon oluşturma, pikseller / parçalar (piksel başına işlemler) üzerinde yapılan işlemler arasındadır. Alfa testi ve öncesinde derinlik testi. Şablon testi, istenmeyen piksellerin derinlik testine ulaşmamasını sağlar. Bu, sahne için işlem süresinden tasarruf sağlar. Benzer şekilde, alfa testi, karşılık gelen piksellerin şablon testine ulaşmasını engelleyebilir.

Testin kendisi, şablon tamponu üzerinde, içindeki bir değere kadar gerçekleştirilir veya değiştirilir veya kullanılır ve sözde şablon işlevi ve şablon işlemleri aracılığıyla gerçekleştirilir. Stencil işlevi, belirli bir pikselin şablon değerinin belirli bir referans değeriyle karşılaştırıldığı bir işlevdir. Bu karşılaştırma ise mantıksal olarak doğru şablon testi geçer. Aksi takdirde değil.

Bunu yaparken, üç farklı durum derinliği ve şablon tamponunu karşılaştırmanın sonucunun neden olduğu olası reaksiyon:

  • Şablon testi geçilmedi
  • Şablon testi geçilir ancak derinlik testi geçilmez
  • Her iki test de geçti (veya şablon testi geçti ve derinlik etkinleştirilmedi)

Bu durumların her biri için, incelenen piksel üzerinde farklı işlemler ayarlanabilir. OpenGL kalıp işlevlerinde, sırasıyla referans değeri ve maske, glStencilFunc işlevini tanımlar. Direct3D'de bu bileşenlerin her biri, hâlihazırda kontrolde olan SetRenderState cihazları yöntemleri kullanılarak ayrı ayrı ayarlanır. Bu yöntem, ilki ayarlanmış bir koşul ve diğeri de değeri olan iki parametre bekler. Yukarıda kullanılan sipariş, bu koşullara D3DRS_STENCILFUNC, D3DRS_STENCILREF ve D3DRS_STENCILMASK adı verilir.

OpenGL'deki kalıp işlemleri, üç değer bekleyen glStencilOp işlevini ayarlar. Direct3D'de, yine, her durum belirli bir yöntem SetRenderState ayarlar. Ameliyata atanabilecek üç durum D3DRS_STENCILFAIL, D3DRENDERSTATE_STENCILZFAIL ve D3DRENDERSTATE_STENCILPASS olarak adlandırılır.

Yönetim

Şablon tampon uygulamalarının aralığı oldukça geniş olmasına rağmen, birkaç iyi bilinen uygulamadan bahsedebiliriz.

Yerin üstündeki resimde beyaz yüzeyin hemen üstünde olan resim, derin bir mücadelenin etkisini engellemeye yetmez. Bunun tersine, stensilinga'da (alt şekil) bu etki, eş düzlemli yüzeyler olsalar bile tamamen ortadan kalkar.

Z savaşı

Z tamponundaki hassasiyet eksikliğinden dolayı, kısa menzilli veya üst üste binen eş düzlemli çokgenler, çok sayıda düzensiz enine kesite sahip tek bir düzlem olarak gösterilebilir. Bu bölümler, kamera konumuna ve diğer parametrelere göre değişebilir ve hızla değişmektedir. Buna Z-savaşı denir. Bu sorunun birden fazla çözümü var:

- Sahnenin derinliğini sınırlandırmak için uzak düzlemi yaklaştırın, böylece Z tamponunun doğruluğunu artırın veya nesnelerin sahnede göründüğü mesafeyi azaltın.

- Şablon arabelleği için bellek pahasına mümkün olan Z-arabelleğine ayrılan bit sayısını artırın.

- Çokgenleri birbirinden uzaklaştırın, bu da sanatçının ayrıntılı bir sahne yaratma olanaklarını kısıtlar.

Soruna yönelik tüm bu yaklaşımlar, yalnızca çokgenlerin Z çatışması yaşama olasılığını azaltabilir ve genel durumda kesin bir çözümü garanti etmez.

Şablon tamponunu içeren bir çözüm, hangi çokgenin diğerlerinin önünde olması gerektiği bilgisine dayanır. siluet ön çokgenin, şablon arabelleğine çekilir. Bundan sonra, sahnenin geri kalanı yalnızca siluetin negatif olduğu yerde oluşturulabilir ve bu nedenle ön çokgenle çakışmaz.

Gölge hacmi

Gölge hacmi kullanılan bir tekniktir 3D bilgisayar grafikleri işlenmiş bir sahneye gölge eklemek için. İlk önce tarafından önerildi Frank Crow 1977'de[2] bir ışık kaynağından tıkanan bölgenin 3 boyutlu şeklini tanımlayan geometri olarak. Bir gölge birimi sanal dünyayı ikiye böler: gölgede kalan alanlar ve olmayan alanlar.

şablon arabelleği gölge hacimlerinin uygulanması genellikle modern 3B grafik donanımında kullanım için en pratik genel amaçlı gerçek zamanlı gölgeleme teknikleri arasında kabul edilir. Tarafından popülerleştirildi video oyunu Doom 3 ve bu oyunda kullanılan tekniğin belirli bir varyasyonu olarak bilinir hale geldi Carmack'in Tersi.

Düşünceler

Yansıma Bir sahnenin kendisi, sahnenin kendisi dönüştürülürken ve "ayna" düzlemine göre yansıtılırken çizilir; bu, birden fazla oluşturma geçişi ve geçerli oluşturma geçişinin çalıştığı alanları kısıtlamak için şablon arabelleğinin kullanılmasını gerektirir:

  1. Ayna alanları hariç sahneyi çizin - her ayna için Z-arabelleğini ve renk arabelleğini kilitleyin
    1. Aynanın görünen kısmını işleyin
    2. Derinlik testi, her pikselin maksimum değeri girmek için geçmesi ve her zaman geçmesi için ayarlanır.
  2. her ayna için:
    1. Derinlik testi, yalnızca bir pikselin mesafesi geçerli olandan daha az olduğunda geçecek şekilde ayarlanır (varsayılan davranış)
    2. Matris dönüşümü, sahneyi ayna düzlemine göre yansıtacak şekilde değiştirilir
    3. Z tamponunun ve renk tamponunun kilidini açın
    4. Sahneyi çizin, ancak sadece ayna düzlemi ile kamera arasında kalan kısmını çizin. Başka bir deyişle, ayna düzlemi aynı zamanda bir kırpma düzlemidir
    5. Renk arabelleğini tekrar kilitler, derinlik testi her zaman geçecek şekilde ayarlanır, bir sonraki yansıtma için şablonu sıfırlar.

Düzlemsel Gölgeler

Gölgelerin düzlemini çizerken iki baskın sorun vardır: Birincisi, gölgelerin gölgesiyle kaplı kısımda ve dışarıda düz geometrinin ödüllendirilmemesi durumunda derin mücadele sorunuyla ilgilidir. Bununla ilgili bölüme bakın. Diğer bir sorun, düzlemin orada bulunduğu alan dışındaki gölgelerin boyutu ile ilgilidir.

Tekniğe bağlı olarak ortaya çıkabilecek veya görünmeyebilecek başka bir sorun, gölgenin bir bölümünde daha fazla çokgen tasarlanması ve aynı gölgenin daha koyu ve daha açık kısımlarının ortaya çıkmasıdır. Her üç problem de geometrik olarak çözülebilir, ancak donanım hızlandırmanın doğrudan kullanılması olasılığı nedeniyle, şablon arabelleğini kullanan çok daha zarif uygulamalardır: 1. Işıkları ve ışıkları etkinleştirin 2. Yansıtılması gereken herhangi bir poligon içermeyen bir sahne çizin gölgeler 3. Gölgeler olması gereken, ancak ışıksız tüm çokgenleri çizin. Bunu yaparken, şablon tamponu, her çokgenin pikseline ait oldukları zemin için belirli bir değere atanacaktır. Bu değerler arasındaki mesafe en az iki olmalıdır, çünkü her düzlemde iki durum için iki değer kullanılmalıdır: gölgelerde ve parlak. 4. Tüm genel aydınlatmayı devre dışı bırakın (sonraki adımların yalnızca seçilen bireysel ışığı etkilemesini sağlamak için) Her düzlem için: Her ışık için: 1. Bir şablon arabelleğini ve yalnızca seçilen düzey için belirli bir değer taşıyan pikselleri düzenleyin. Belirli bir seviyenin tarihi ile aydınlık arasında yansıtılan nesneler olan tüm piksellerin değerini artırın. 2. Belirli değerinin bir kısmının değiştirilmediği seviyeyi çizmesi için yalnızca seçilen ışığa izin verin.

Uzaysal gölgeler

Uzamsal çizim gölgelerinin şablon tampon uygulaması, hacmi içinde bulunan sahnenin bir bölümünü içeren geometrik bir gövdenin herhangi bir gölgesidir. Sahnenin herhangi bir bölümü bu hacme aitse ışık verilmez, aksi takdirde aydınlatılır. Bu sorun, ışık sayısındaki artışla birleşir, ancak gölgelerin düştüğü alanların sayısını ele almaz. Sorunun birkaç çözümü var, ancak aşağıdaki algoritmayı uyguladık: 1. Işıksız bir sahne çizin 2. Z-tamponunu ve renk tamponunu kilitleyin, böylece ikisi değişiklik yapamaz Her ışık için 1. Derinlemesine kullanma sahne hakkında bilgi (Z-arabellek) şablon arabelleğini yalnızca ses gölgesinin mevcut olmadığı veya mevcut binalardan görünmeyen bölümlerinde doldurmak için. 2. Renk tamponunun kilidini açın ve yalnızca derinlik değerinin mevcut bir değere eşit olduğu durumlarda değişikliklere izin vermek için Z tamponunun işlevini ayarlayın 3. Sadece bu ışıkla aydınlatılan sahneyi çizin, ancak yalnızca şablon testini geçen sahnenin bir kısmı için

Bu pasajların her biri, temiz bir şablon tamponunun kullanılabileceği anlamına gelir.

Gölgelere gelince, bu teknik uzayın güçlü ışık altında kalan kısımlarını aydınlatmak için kullanılabilir. Örneğin, havada büyük miktarda toz bulunan karanlık bir odadaki spot ışığının parlaklığının uygun hacimde alanı aydınlattığı görülebilir.

Diğer uygulamalar

Diğer bir örnek, sahnenin aydınlatılmış ve gölgeli kısmı arasındaki geçişin odak dışı olduğu sözde yumuşak gölgedir. Spesifik olarak, bu efekt şablon arabelleğini elde etmenin bir yolu, gölgenin hacmini çarpmaktır ve kopyalar, sırasıyla, düşük bir büyütmeyle geometrik bir diziye göre ölçeklenir, örneğin. 1.04. Ölçeklendirme merkezi, üst hacmi temsil eden çokgenin ağırlık merkezi olabilir. Bu kendi başına istenen efekti veren bir dizi bileşik gölge verecektir.

Başka bir uygulama, modelleme tekniği katıları sırasında görselleştirme alanını içerir Yapıcı Katı Geometri (CSG), burada şablon tamponu, Z-tampon ile birlikte, problemleri başarıyla çözebilir. Boole SOLiD operasyonları.

OpenGL

glEnable(GL_STENCIL_TEST); // varsayılan olarak etkin değilglStencilMask(stencilMask); // şablon arabelleğine yazmaya izin ver, varsayılan olarak (0xFF) maske yok.glClearStencil(clearStencilValue); // şablon değerini temizle, varsayılan olarak = 0glStencilFunc(işlev, ref, maske); // varsayılan olarak GL_ALWAYS, 0, 0xFF, her zaman şablon testini geçglStencilOp(başarısız,zfail,zpass); // varsayılan olarak GL_KEEP, GL_KEEP, GL_KEEP, şablon arabelleğini değiştirmeglClear(GL_STENCIL_BUFFER_BIT); // şablon arabelleğini temizle, doldur (clearStencilValue & stencilMask)

Test: (ref & mask) func (stencilValue & mask)

Üç olası şablon işlevi / derinlik işlevi durumuna bağlı olarak.

1. Şablon Test İşlevi başarısız:

   Eğer fonksiyon GL_NEVER ise, şablon testi her zaman başarısız olacaktır. Renk / Z-arabellekleri değiştirilmez. Şablon arabelleği, glStencilOp başarısızlığına göre değiştirilir. GlStencilOp (GL_REPLACE, GL_KEEP, GL_KEEP) derse GL_REPLACE gerçekleşir ve stencilValue = (ref & stencilMask) // ref olur

2. Şablon Testi İşlevi başarılı / Derinlik Testi İşlevi başarısız:

  Eğer işlev GL_ALWAYS ise, şablon testi her zaman başarılı olacaktır, ancak derinlik testi başarısız olabilir. Renk / Z-arabelleği değiştirilmez. Şablon arabelleği, glStencilOp zfail'e göre değiştirilir. Eğer glStencilOp (GL_KEEP, GL_INCR, GL_KEEP) derse GL_INCR gerçekleşir ve stencilValue = (stencilValue + 1) // 1 olur

3. Şablon İşlevi geçer / Derinlik İşlevi geçer:

  Eğer işlev GL_ALWAYS ise, şablon testi her zaman geçecektir. Derinlik testi de geçerse. Her iki Renk / Z-arabellek değiştirildi. Şablon tamponu, glStencilOp zpass'a göre değiştirilir. Eğer glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP) derseniz Stencil değerleri değiştirilmez, sadece Color ve Z-tamponları değiştirilir.

Tipik olarak Şablon arabelleği, Z arabelleği ve renk arabelleği maskeleri yanlış olarak ayarlanarak başlatılır. ve sonra her seferinde şablon testini geçemeyerek şablon arabelleğine uygun ref değerini ayarlama.

  // renk ve Z tamponlarını devre dışı bırak  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);  glDepthMask(GL_FALSE);  glStencilFunc(GL_NEVER, 1, 0xFF); // şablon testini asla geçemezsiniz  glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);  // şablon tampon değerlerini ref = 1 olarak değiştirin  glStencilMask(0xFF); // şablon arabelleği yazmak için ücretsiz  glClear(GL_STENCIL_BUFFER_BIT);  // varsayılan şablon değerini (0) tüm şablon arabelleğine yazarak ilk önce şablon arabelleğini temizleyin.  draw_stencil_shape(); // şablon şeklinde, şablon arabelleğindeki piksel konumları, şablon arabelleği değerlerini ref = 1 olarak değiştirir

Şimdi yalnızca şablon değerinin 1 olduğu konumlarda yazmak için başlatılmış şablon arabelleğini ve şablon testini kullanın

  // renk ve Z tamponlarını etkinleştirin.  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);  glDepthMask(GL_TRUE);  // şablonda ve derinlik geçişinde şablon arabelleğinde artık değişiklik yapılmaz.  glStencilMask(0x00);  // glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP) ile de elde edilebilir;  // stencil testi: şablon testini yalnızca stencilValue == 1'de geç (Derinlik testinin başarılı olacağı varsayılır.)   // ve gerçek içeriği yalnızca şablon şekli konumlarında derinliğe ve renk arabelleğine yazın.  glStencilFunc(GL_EQUAL, 1, 0xFF);   draw_actual_content();

Ayrıca bakınız

Referanslar

  1. ^ https://msdn.microsoft.com/en-us/library/windows/desktop/bb206123(v=vs.85).aspx
  2. ^ Crow, Franklin C: "Bilgisayar Grafikleri için Gölge Algoritmaları", Bilgisayar Grafikleri (SIGGRAPH '77 Proceedings), cilt. 11, hayır. 2, 242-248.