Değişken çizgi genişliğine sahip Toon / cel gölgeleme?


15

Orada cel gölgelendirme yapmak için birkaç geniş yaklaşım görüyorum:

  1. Ters çevrilmiş normallerle modelin çoğaltılması ve büyütülmesi (benim için bir seçenek değil)
  2. Kenar tespiti için sobel filtre / parça gölgelendirici yaklaşımları
  3. Kenar tespiti için şablon tampon yaklaşımları
  4. Yüz ve kenar normallerini hesaplayan geometri (veya tepe) gölgelendirici yaklaşımları

Geometri merkezli yaklaşımın, aydınlatma ve çizgi kalınlığı üzerinde en fazla kontrolü sağladığını varsayarak doğru muyum? kademeli olarak ovaya karışan bir tepenin siluet çizgisini görebileceğiniz arazi için?

Arazi yüzeylerimde piksel aydınlatmasına ihtiyaç duymazsam ne olur? (Ve muhtemelen hücre tabanlı tepe noktası veya doku haritası tabanlı aydınlatma / gölgeleme kullanmayı planladığım gibi olmayacak.) O zaman geometri tipi yaklaşıma sadık kalmak daha iyi olur mu yoksa bunun yerine ekran alanı / parça yaklaşımı mı tercih ederim? basitleştirmek için? Eğer öyleyse, sadece tüm ağın ana hatlarından ziyade (o ana hat içinde "mürekkep" ayrıntıları olmadan) ağ silueti içindeki tepelerin "mürekkeplenmesini" nasıl elde edebilirim ? (AKA düşündüren konturlar , kırışıklıklar ).

Son olarak, bir geometri gölgelendirici kullanarak çevrilmiş normaller yaklaşımını ucuz bir şekilde taklit etmek mümkün müdür? Bununla ilgili endişem, her bir tepe noktasını kesinlikle kopyalayabildiğim ve bunları buna göre ölçeklendirebileceğim, ancak parçalayıcı normallerde ve parça gölgelendiricideki farklı renklendirmeye nasıl yaklaşacağım?

Ne istiyorum - siluet içindeki müdahaleci çizgilerle değişen çizgi kalınlığı ...

resim açıklamasını buraya girin

Ne istemiyorum ...

resim açıklamasını buraya girin


DÜZENLEME: Daha fazla araştırma aşağıdakileri ortaya çıkardı ...

Mesafe tabanlı LoD düşünülse bile arazide büyük bir tepe noktası sayım olduğundan, ne ters çevrilmiş normaller ne de geometri gölgelendirici tabanlı bir yaklaşım (frustum culling ile bile), çoğaltma ve ölçeklendirmede yer alan şeffaf hesaplama karmaşıklığı nedeniyle mantıklı bir seçenek olmazdı yüklenen köşe noktaları.

Arazi yüzeylerinde katı tonlu gölgelendirme şeklinde piksel başına aydınlatmaya ihtiyacım olmadığı düşünüldüğünde, yüz-normal tabanlı yaklaşımları - aksi takdirde doğru yüzey aydınlatması için bir gereklilik - dikkate almak daha az ihtiyatlı hale gelir. doğal olarak hesaplanması oldukça pahalıdır. Ancak en iyi kontrolü sağladıkları doğrudur; örneğin, "sanatsal" vuruşları kullanarak kenarları gölgeleme yeteneği: Güzel, ama yine de, çok karmaşık bir oyun ortamı için gerçekten uygun değil.

Şablon tamponları, gölgelendiricilerdeki tüm işleri yapmayı tercih ettiğim için kaçınmak istediğim bir şeydir. (Kırmızı taslaklı yukarıdaki örnek, şablon tamponu eski okuluyla yapıldı.)

Bu, parça gölgelendirici görüntü-uzay yaklaşımları bırakır. Hesaplama karmaşıklığı, köşe sayısı yerine parça sayısına azaltılır (benim durumumda, bu, geometri gölgelendiricisinde yapmak zorunda olduğumdan 10-100x daha az işlemdir). Bu, süreksizlik filtreleri (örn. Sobel operatörü) uygulayabileceğimiz bir g-tamponu (normal bir tampondan ve isteğe bağlı olarak bir derinlik tamponundan oluşur) oluşturmak için birden fazla render geçişi gerektirir. Derinlik süreksizliği, müstehcen konturları ve kırışıklıkları mümkün kılan şeydir. Bu yaklaşımla tek sorunum, parçalanmış gölgelendiricideki doğru algoritma ile, mürekkepli kenar genişlikleri üzerinde daha ince kontrol sağlayamama.

Yani soru şimdi daha spesifik hale geliyor: Bir parça gölgelendiricide değişken kenar genişliklerini, özellikle dış siluetde, tam olarak nasıl girerim?


Değişen çizgi kalınlığı geometrik yaklaşımın bir özelliğidir. Başka türlü verimli bir şekilde elde edemezsiniz. Bunu istediğinizden, piksel gölgelendiricilerini "daha verimli yöntem" olarak görmüyorum: aranacak piksel sayısı = (line_thickness * 2 + 1) ^ 2 - 1. Temelde işlem sonrası gölgelendiricinizin maks. ise çok (tahmin: 10x) daha yavaş olacaktır. çizgi genişliği 2'ye eşittir.
snake5

@ snake5 Dürüst olmak gerekirse, GS'de render güncellemesi başına 150 milyon köşe boyunca (görünüm kaldırma ile yaklaşık 25 milyon) çalışmamı mı öneriyorsunuz? Bunu gerçekten satın almıyorum, ama girdi için teşekkürler. Tepe sayıları ve karmaşıklık hakkında yukarıda söylediğim şeylere bakın. 10x figürünüzle bile, parça gölgelendirici en azından hatta çizer ve muhtemelen çok daha iyi bir cehennem yapar.
Mühendis

23 milyon doku örneğine karşı 25 milyon köşe noktası (doğrusal okuma / yazma) (oldukça önbelleğe alınmış bellek okumaları + oluşturma hedefi verilerinin sıkıştırması) @ 1280x720. Tepe noktası sayısını sınırlamak / azaltmak bu arada çok daha kolaydır. Özellikle bu günlerde büyük monitörler (1920x1080 +) ve multimonitor kurulumları çok popüler olduğunda.
snake5

kırmızı anahatlar üreten algoritma ile aynı algoritmayı kullanmaya ve sonra derinliklerine göre çizgileri inceltmeye / büyütmeye ne dersiniz?
Ali1S232

@Gajoo, Soruda söylediğim gibi, bu sadece siluetle ilgili değil. İlk görüntüde kızın omzunun arkasındaki müdahaleci çizgilere dikkat edin. Bunlar çevrilmiş normaller yaklaşımının bir fonksiyonudur ve müstehcen konturlar / kırışıklıklar gibi davranırlar. Aynı lazım.
Mühendis

Yanıtlar:


4

Derinlik tamponunun süreksizlik filtrelemesi ile bir parça gölgelendirici yaklaşımı ile gitmeye karar verdim. Bunun nedenleri:

  1. Dünya tepe sayısı, kafes LoD ile bile, büyük görüş mesafeleri nedeniyle çok, çok yüksektir;
  2. Aynı geçişte aynı yapılardan (kutu veya gaussian örnekleme / filtreleme) faydalanabilecek DoF bulanıklık gibi bir dizi parça gölgelendirici işlemi yapıyorum.

Test ettikten sonra, gelecekteki projelerde karmaşıklık nedenlerinden ötürü geometriye dayalı bir yaklaşıma gideceğimi söyleyebilirim. Bunun nedeni (yorumlarda önerildiği gibi), kenar tespiti için parça gölgelendirici yaklaşımlarının, özellikle karışıklık yarıçapı çemberi ve dolayısıyla parça başına örnek sayısının oldukça yüksek olabileceği DoF uygulamaları ile hesaplama açısından yoğun olabilmesidir. Neyse ki anahat gölgelendiricileri için daha az endişe duyuyor.


Ben normal normal süreksizlik devam düz normal olması durumunda size daha iyi sonuçlar verecektir düşünüyorum. Örnekleri birbirinden uzaklaştırarak çizgi genişliğini değiştirebilirsiniz.
Grieverheart

@Grieverheart Bu kabul edilen cevap, çünkü kullandığım yöntem gayet iyi çalışıyor. Teşekkürler.
Mühendis

0

Eğer bir sonra efektini kullanabiliyorsanız, aslında çok kolay bir genel çözüm vardır. Harika olan şey, poli sayınızın ne kadar yüksek olduğu önemli değil. Bir Derinlik haritasını gri tonlama olarak oluşturun, ardından iki bitişik piksel arasındaki kontrast bir eşik değerinden daha yüksek olduğunda istediğiniz çizgi renginde bir nokta oluşturun. Oluşturduğunuz görüntünün kontrastına ve / veya ışık düzeyine göre noktayı büyütebilirsiniz.

ToonShader algoritmasını 2000/2001'de, bu çözümü yaratan Fransız dostundan önce bile icat ettim. Maden gerçek malzeme geometrisine dayanıyordu. Daha sonra bunu yapmanın temel olarak iki yolu vardır: 1. normallere bakın, eğer bir çizgiye bağlı iki düzlem uzağa ve kameraya doğru bakıyorsa, o çizgiyi oluşturun, daha sonra çizgili derinlikler için ipucu olarak derinlik, ışıklandırma vb. Kullanabilirsiniz. 2. Oluşturulan geomerty'ye bakın (perspektif dönüşümünün ardından) Her bir çizgiyi alın, eğer bağlantı düzlemlerinin köşeleri bu çizginin aynı tarafındaysa, çizgiyi oluşturursunuz. Sonra çizgi kalınlığı için aynısını yapabilirsiniz. yöntem 1. 3. Bu üç tekniğin kombinasyonlarını yapabilirsiniz, ancak ilkinden bahsettim, çünkü büyük bir poli-sayımı belirtmiştiniz.

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.