Kapsam - algoritmada kusur - kullanımından nasıl kurtulur?


10

Giriş

Ana vektör grafik oluşturma motorlarının çoğunun içinde algoritmik bir kusur vardır. Her bir şekli ayrı ayrı oluştururlar ve piksel kapsamını hesaplayarak kenar yumuşatırlar ve sonra birbirlerinin üzerine oluştururlar. Evet, basit ama doğru çözümler daha da basit.

Bu, kapsama alanını şeffaflıkla sınırladığı için bir birleşme sorununa yol açar. Alfa harmanlama, durumu doğru bir şekilde temsil etmeyen bir kuralı izler; örneğin,% 50 tamamlayıcı örtülü bir pikselle komşu olan% 50 örtülü bir piksel alın% 100 kapsama alanı ile sonuçlanmaz,% 75 kapsama alanı ile sonuçlanır . Bunun nasıl göründüğü, algoritmanın nasıl ayarlandığına ve diğer ayrıntılara bağlıdır, ancak özünde bu bilinen bir hatadır. Hatta birisi, farklı motor hatalarını belgeleme ve bunun nasıl daha iyi yapılabileceğini gösteren bir kağıt yazma zahmetinden bile geçti .

resim açıklamasını buraya girin

Resim 1 : Üst satırda büyütülmüş hata gösteren üçgenlerden oluşan bir şekil oluşturmak için tamamen temsili olmayan örnek. SVG kaynağı

Sorun basit naif bir çözüm * kapsamı hesaplama olmadan sadece süper örnek ve görüntü aşağı filtre. Bonus olarak, kutu filtrelemeden daha iyi görüntü yeniden oluşturma algoritmaları kullanabilirsiniz ( Bir Piksel Kare 3 değildir ). Mevcut çözümler olarak karşılaştırılabilir hıza sahip çözümler bile var ve bu çözümlerin donanım rasterleştirme boru hatlarında yapılması çok daha kolay (ve GPU'da nadiren bu hatayı görüyorsunuz çünkü sadece bu sorunu önlemek için inşa edildi).

Bu da maliyetsiz bir sorun değildir. Grafik tasarımda çalışan ve burada üst üste binme olduğundan ve bilgisayarın kendileri için yapması gereken sorunu düzeltmek için hiçbir çakışma olmadığından emin olarak bu sorunu manuel olarak atlatmaya çalışırken çok fazla zaman harcayan birçok insan var. Ve birçok durumda muhteşem bir şekilde başarısız oluyor. Ancak müşterileri hatanın neden orada olduğu umrunda değil, düzeltmeleri gerekir.

Soru

Hata nasıl yayılır? Hepsi aynı hatayı yaptıkları için algoritmaları için aynı kaynağı kullandıkları sonucuna varılabilir. Tasarımcıların bu algoritmayı seçmesine ne neden olabilirdi? Neden sadece 3B programcılar bu hatayı fark etti ve hatta 2B programcılar tanımadığında API'larındaki ve öğretimindeki rolünü kodladı?

Bu hatanın daha fazla yayılmasını durdurması nasıl sağlanır?


Zeyilname (ama ben bunu sormuyorum)

* Görünüşe göre süper örneklemenin kusursuz çalıştığı iddiaları olağanüstü ve olağanüstü kanıt gerektiriyor. Tamam, süper örnekleme çalışmasının anahtarı , süper örneklemenin kapsam işleme yapmamasıdır. Esasen süper örnekleyici her numuneye bir nokta numunesi olarak davranır. Puan örneği altta yatan alanla ilgili herhangi bir varsayım yapmadığından, gerçekleşmediği yerde alfa karşılaştırmasına neden olmaz.

Cevaplardan birinde açıklandığı gibi tutarlı çalışması için. Tutarlılık için numuneleri tamsayı örnekleme ile işlemek gerekir. Bu bize bir zamanlar ekran boşluğuna dönüştürülen her noktanın eşit koordinatlar için tam olarak aynı çözümü elde etmesini ve hiçbir numunenin piksel kenarlığıyla 2 kez gölgelenmemesini sağlar. Bunu yapmak için bir örnek, örneğin sol taraftaki alt örnek ise bir piksel otunun tam olarak açık olmasını tetiklemeyebilir (bu nedenle tam kenarların> vs <= olarak işlendiğine dair bir kural koyarız). Bir konsol grafik kartı hariç tümü bu şekilde çalışır. Ek verilerin önbelleğe alınmasına ve yakınlarda ekstra test yapılmasına gerek yoktur. Bu çözüm, kapsama dayalı çözümlerden daha kararlı, daha genel ve tutarlıdır .

Algoritma, biraz daha az kod ve biraz daha fazla örnek içeren orijinal ile tamamen aynıdır. Dolayısıyla, kapsama dayalı algoritmadan daha fazla olmasa bile tutarlıdır. Bunu biliyoruz çünkü bu tür yöntemleri neredeyse diğer tüm sinyal işleme alanlarında ve grafik kartlarında kullanıyoruz.

Peki bu yöntemin bir dezavantajı var mı? Sadece saf bir varsayım yaparsanız biraz daha yavaştır. Teorik olarak kapsama rasterleştiricisinden daha hızlı bir asimptotik davranışa sahiptir, bir ışın izleyici gibi, tipik sahnelerde hala sadece eşittir. Ayrıca, evrişim bazlı etkilerin kullanımını daha acı verici hale getirebilir.


İş günüm bittiğinde amnendum için resim ekleyeceğim. Tüm bu grafik işleme sonra görsel bir yorum var
joojaa

Yanıtlar:


6

Süper örnekleme, saf olarak yapıldığında, hesaplama açısından pahalıdır, çünkü örneğin ekranınızın piksel boyutunun yarısını kullanırsanız, bellek ve bant genişliğinin dört katına ihtiyacınız vardır. Wikipedia bundan bahsediyor ve aynı zamanda uyarlanabilir süper örneklemeyi olası bir çözüm olarak adlandırıyor. Ancak bu, algoritmayı çok daha karmaşık, karmaşık ve uygulaması daha zor hale getirmeye başlar.

Ve sanırım aradığınız neden budur: çok daha fazla bellek ve çalışma süresi gerektirmeyen bir algoritma istiyorsanız, işler naif "şeffaflık" yaklaşımından çok daha karmaşık hale geliyor.


Aslında örnekleri saklamanız gerekmez tek yapmanız gereken depo rasterleştirme kurulumudur. Kapsama dayalı yöntem de depolamaz, bu nedenle bu geriye doğru bir adım değildir. Naif yöntem sadece sunulur, çünkü anlaşılması kolaydır, öncelikli örneklemeyi kolayca yapabilirsiniz. Ayrıca kapsama dayalı çözümlerinizi GPU'ya taşımak istiyorsanız, çok fazla fazla iş yapmanız gerekecek ve modeliyle uyumsuz olacaksınız.
joojaa

@joojaa: "rasterleştirme kurulumunu saklayarak" ne demek istediğinizi ana hatlarıyla belirtebilir veya yaklaşımın kendisinin> 20 sayfalık bir bilimsel makale aracılığıyla kendini kazması gerekmeyecek şekilde açıklandığı bir bağlantı verebilir misiniz?
Doc Brown

Her piksel birbirinden bağımsızdır, bu nedenle sadece piksel yaparken örnekleri kaydetmeniz gerekir, bundan sonra bunları güvenle atabilirsiniz. Daha yüksek bir sipariş fiteri kullanmak istiyorsanız, yalnızca sınırlı bir görünüm depolayabilirsiniz. Bu yüzden gerçekten yapmanız gereken tek şey işlem çekirdeğiniz için bellek ayırmaktır (belki iş parçacığı başına 16-256 bayt)
joojaa

oh üzgünüm bile kutu filtreleme yaparsanız örnekleri depolamanıza gerek yok, sadece bireysel örnekleri saklamanıza gerek olmayan hareketli / çalışma ortalaması için formülü kullanabilirsiniz
joojaa

@joojaa: Anlamıyorum - önce tüm ilgili şekillerden , belki de yüzlerce veya binlerce örnek hesaplamanıza gerek yok , daha sonra tarama ekranınıza filtre uygulamanız gerekmez mi?
Doc Brown

6

Süper örnekleme sorunu genel olarak çözmez: sadece daha az fark edilir hale getirir. Pikselin yarısı büyüklüğünde, sorun yarısı kadar belirgin olacak, ancak ortadan kalkmayacak.

Bu tasarımların arkasındaki mimari nokta, "ABC üçgenini oluştur" komutunun kesin bir anlam taşımasını istememizdir. Çizim komutları koleksiyonunun bir parçası olarak değerlendirilmedikçe belirsiz olmasını istemiyoruz - örneğin, "üçgen BCD oluştur" da koleksiyonda (aynı veya farklı bir renkle) olduğunda bir anlamı olması ve değil.

Örneğin, bin üçgen göz önüne alındığında, bir tarafın veya bir tarafın bir kısmını ABC ile paylaşan tüm üçgenleri bulmak bile hesaplama açısından ağırdır (bin kez yeniden yapılması gerektiğini hatırlamak). Diğer birçok pratik sorun da var: özellikle yeni bir ek talep nedeniyle yeniden değerlendirilmeleri gerekiyorsa, uzun bir süre önce çizilse bile, tüm orijinal işleme isteklerinin saklanması gerekiyor.

Sonuç olarak, mükemmel tutarlı bir çözüm uygulanabilir değildir. Soru var: Yapabildiğimiz zaman mevcut durumu iyileştirmeye çalışmalı mıyız? Genel olarak, bu sorunun cevabı sayılı modeli kendisi gösterdik sınırlamaları vardır bile, bir modelin Mükemmel tutarlı bir şekilde uygulanması her zaman daha iyidir. Alternatif, programcının bu iki durumdan hangisinin belirli bir durumda tutacağını bilmesinin hiçbir yolu olmadan, bazen daha iyisini yapan ve bazen yapmayan bir uygulama olacaktır. Ayrıca, programcı tarafından yapılan küçük değişikliklerin bir sonucu olarak - hatta programcının kontrolü dışındaki değişikliklerin bir sonucu olarak “daha ​​iyisini yapar” dan “daha ​​iyisini yapmaz” a atlayabilir. Programlama bağlamında tahmin edilebilirlik çok uzak,


Benim süper örneklem kapsama hesaplama yapmazsa bu kapsama hesaplaması bir sorundur, o zaman sadece sorunu azaltmak değil rea cevabına yakınlaşacağı için problemleri yoktur. Bunu kanıtlamak için bir koda ihtiyacınız var mı? Grafik kartınız bu şekilde çalışır ve bu sorunla karşılaşmaz. Aksi takdirde gördüğünüz her oyun sorunu sergileyecektir. Yanlış mantığa dayalı olduğu için bu cevabı satın almıyorum.
joojaa

@joojaa oyunları herhangi bir kenar yumuşatma yapmaz veya kenar yumuşatma için süper örnekleme kullanır, bu da genellikle dört kenar yumuşatma düzeyi sağlar. Bu, kenar yumuşatma konusunda yaklaşık 64 seviye istediğiniz sunum kalitesinde grafikler için yeterince iyi değildir. Oyunlar bir problemi diğeriyle değiştiriyor.
Pete Kirkham

@PeteKirkham ayarınıza bağlıdır, bazı gamlar örnek miktarları belirlemenize izin verir. Neyse, kutu filtrelemeden daha yüksek bir sipariş filtresi kullanıyorsanız, sunum seviyesi AA üretmek için 16'dan fazla örneğe ihtiyacınız yoktur. Benim örnek IS hiçbir hata görüntü donanım reasterizer içinde süper örnekleme tarafından yapılır unutmayın.
joojaa
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.