Kısaca: inandırıcı yoğun bir orman bir performans boss dövüşüdür: binlerce yüksek poligonlu ağaç, katmanlı saydamlık ve ufuğa uzanan örnekler. Onu, impostor'larla (bir 3D ağacı her açıdan taklit eden kameraya dönük billboard'lar) biten disiplinli bir LOD zinciri, agresif instancing ve culling, ve ucuz uzak ağaçların kendilerini ele vermemesi için birkaç gölgelendirme hilesiyle kazanırsın. Bu makale zincirin tamamını tam mesh'ten billboard'a yürür, oktahedral impostor hilesini, ve ağır optimize edilmiş bir ormanın ölü görünmesini nasıl engelleyeceğini anlatır.
Buradaki her ağaç kameradan farklı bir mesafede, bu yüzden her ağaç farklı bir maliyet olmalı. Ucuz bir ormanın sanatı, poligonları yalnızca yakındakilere harcamak ve gerisini inandırıcı biçimde taklit etmektir.
Temel fikir: mesafeye göre ödemek
5 metre uzaklıktaki bir ağaç ile 500 metre uzaklıktaki bir ağaç aynı maliyeti tutmamalı. Bir LOD zinciri yakında tam detay ve mesafeyle giderek daha ucuz temsiller harcar, düz bir billboard'da biter; böylece orman büyürken toplam maliyet düz kalır.
Tüm oyun, kameranın zar zor çözdüğü ağaçlar için tam fiyat ödemeyi reddetmektir. Yakında, bir ağaç bireysel yaprak kartlarıyla tam bir mesh'tir; uzakta, düz bir görüntünün mükemmelen ürettiği bir avuç pikseldir. Bir LOD (level-of-detail) zinciri bunu resmileştirir: aynı ağacın azalan maliyetli birkaç sürümü, ekran boyutuna göre değiştirilir, böylece on bin ağaçlık bir orman kabaca ayrıntıda görünen şey kadar maliyete gelir, her ağacın tam kalitedeki toplamına değil. O olmadan, yoğunluk kare süreni doğrusal olarak yere ölçekler; onunla, aynı bütçe için ağaç sayısını çok daha yükseğe itebilirsin.
LOD zinciri, adım adım
LOD0 yaprak kartlarıyla tam mesh (yakın); LOD1–2 azaltılmış geometri ve basitleştirilmiş yapraklar (orta); LOD3 birkaç kart ya da tek bir kart; son LOD bir impostor/billboard (uzak). Her adım kabaca maliyeti yarıya indirir, değişim görünmez kalırken.
Tipik bir yeşillik LOD zinciri şuna benzer bir şey işler: LOD0, tüm yaprak kartlarıyla tam detaylı mesh, oyuncunun hemen yanındaki ağaçlar için; LOD1–LOD2, azaltılmış gövde geometrisi ve daha az, daha büyük yaprak kartları, orta plan için; LOD3, dramatik biçimde basitleştirilmiş bir kart kümesi; ve bir son impostor (esasen düz bir görüntü) uzaktaki her şey için. Zanaat geçiş mesafeleri ve blend'dedir, böylece değişim patlamaz. Dither'lı ya da cross-fade LOD geçişleri değişimi gizler; yanlış mesafede sert bir patlama, illüzyonu kıran ele veren belirtidir. Mesafeleri gerçek kameranıza göre ayarlayın, varsayılanlara değil.
Impostor'lar: her açıdan 3D taklidi
Bir impostor (oktahedral impostor) ağacı düzinelerce açıdan bir atlasa önceden render eder, sonra en yakın yakalanan görünümü bir billboard olarak gösterir. Düz bir billboard'un aksine, kamera etrafında hareket ederken doğru görünür: ucuz, ama 3D-ish.
Zincirin uzak ucu, en büyük tasarrufların yaşadığı yerdir ve impostor, onları kabul edilebilir kılan zeki hiledir. Sade bir billboard (kameraya dönmek için dönen tek düz bir görüntü) doğrudan iyi görünür ama sen hareket ederken doğal olmayan biçimde düzleşir ve kayar. Bir oktahedral impostor bunu, ağacı bir küre etrafına yerleştirilmiş birçok bakış açısından önceden render ederek, onları bir doku atlasına paketleyerek, ve mevcut kamera yönüne en yakın hangi yakalanan açı ise onu göstererek (en yakın birkaç arasında blend ederek) çözer. Sonuç, maliyetin bir kesirinde her açıdan gerçek bir 3D ağaç olarak okunur, bu yüzden impostor'lar inandırıcı uzak ormanların omurgasıdır. Bir kez bake edilirler ve çizmek için neredeyse hiçbir şeye mal olmazlar.
Zemin katmanı örnek sayısını hızla çoğaltır. Çalılık ağaçlarla aynı disipline ihtiyaç duyar: onu instance et, LOD'la, ve sert cull et; 80 metrede bir eğrelti otu hiç çizmemeli.
Instancing ve culling
Tekrarlanan ağaçları örnekler olarak çiz, böylece binlercesi az çizim çağrısına mal olsun, ve agresif cull et: ekran dışında olanı frustum-cull et ve küçük şeyleri distance-cull et. Instancing CPU maliyetini düzeltir; culling seni görünmez için ödeme yapmaktan alıkoyar.
Mükemmel LOD'larla bile, on bin ağacı bireysel nesneler olarak göndermek CPU'yu gömer. Instancing bir ağacın tüm kopyalarını bir avuç çizim çağrısına çökertir, ki bu gerçek bir orman için pazarlık edilemez; bir scatter'ı yerel motor örneklerine bake etmenin sana verdiği tam olarak budur. Bunun üstüne, acımasızca cull et: frustum culling görüşün dışındaki her şeyi düşürür, ve distance culling zemin dağınıklığını ve belirli bir menzilin ötesinde fark edilemeyecek kadar minik olan küçük yeşilliği kaldırır. Özellikle çim ve çalılık sert, yakın cull mesafelerine sahip olmalı, çünkü ağaçlardan daha hızlı örnek sayısını çoğaltırlar. Yoğunluk boyayan ve sonra instance mesh'lere bake eden bir iş akışı (Numivo'nunki gibi) motora yoğun bir ormanın ihtiyaç duyduğu tam olarak batch'lenmiş, cull edilebilir formu teslim eder.
Ucuz ormanı canlı tutmak
Ağır optimizasyon bir ormanın statik ve ölü görünmesine yol açabilir; yakın LOD'larda ince rüzgâr, örnekler arasında renk ve ölçek varyasyonu, ve uzak impostor'ların düz karton olarak okunmasını önleyen gölgelendirme ile karşılık ver.
Tüm bu verimliliğin riski, harika çalışan ve cansız hisseden bir ormandır. Üç ucuz dokunuş onu geri getirir: rüzgâr (yakın LOD'larda vertex animasyonu böylece yakın yeşillik hareket etsin, uzak impostor'lar sabit kalsalar bile; 300 metredeki statik bir ağacı kimse fark etmez), varyasyon (örnek başına ölçek, döndürme ve bir ton randomize et, böylece göz tekrarı yakalamasın; aynı ağaçlar kopyala-yapıştır'ın ele veren belirtisidir) ve impostor'larda gölgelendirme özeni (güneş açısı değiştiğinde bariz kartona düzleşmesinler diye onların aydınlatmasını bake et). Kazandığın kare süresini bu detaylara yakında harca, oyuncunun gerçekten baktığı yere, ve optimize edilmiş orman optimize edilmemiş bir orman kadar canlı hissettirir; birkaç kat daha hızlı çalışırken.
Çalmaya değer saha sayıları
- Maliyet ilkesi: mesafeye göre öde; uzak bir ağaç yakın bir ağaç gibi mal olmamalı
- LOD zinciri: tam mesh → azaltılmış → kart kümesi → impostor, her biri ~maliyeti yarıya indirir
- Impostor = bir atlasta önceden render edilmiş açılar → her görüşten 3D-ish billboard
- Tekrarları instance et (az çizim çağrısı) + küçük uzak yeşilliği sert-cull et
- Onu canlı tut: yakın-LOD rüzgârı + örnek başına varyasyon + bake edilmiş impostor gölgelendirmesi
Mini-SSS
Billboard ile impostor arasındaki fark nedir? Bir billboard, kameraya dönmek için dönen düz bir görüntüdür ve sen etrafında dönerken düzleşir. Bir impostor birçok açıyı depolar ve doğru olanı gösterir, bu yüzden 3D'de tutar. Oyuncunun etrafında dolaştığı ya da geçtiği her şey için impostor kullan; sade billboard'lar yalnızca gerçekten uzak, statik arka planlar için iyidir.
Bir ağacın kaç LOD seviyesine ihtiyacı vardır? Yaygın olarak üç ile dört artı bir impostor. Daha fazla otomatik olarak daha iyi değildir, çünkü her seviye authoring ve bellek maliyetidir. Her değişimi küçük, fark edilmez bir adım yapmaya yetecek kadar hedeftir, bir maksimum değil.
Nanite bunu geçersiz kılar mı? Geometri tarafını değiştirir: Nanite geleneksel LOD'lar olmadan yoğun mesh detayını ele alır. Ama saydamlık (yaprak kartları), instancing disiplini ve culling hâlâ önemlidir, ve uzak mesafe için impostor'lar hâlâ kullanışlıdır. İlkeler hayatta kalır; araçlar kayar.
Orman performansını en sık ne öldürür? Örtüşen saydam yaprak kartlarından overdraw ve cull edilmemiş zemin yeşilliği. Yaprak kartlarını sıkılaştır, çalılığı yakında cull et, ve her şeyi instance et; bu üçlü, ağaç mesh'lerine dokunmadan önce bütçenin çoğunu geri kazanır.
Yoğun bir orman render edilmesi en cezalandırıcı ve doğru yapılması en ödüllendirici şeylerden biridir. LOD zincirini kur, impostor'ların mesafeyi taşımasına izin ver, acımasızca instance et ve cull et, ve tasarruflarını yakında rüzgâr ve varyasyona harca; ufka uzanan ve kare hızını tutan bir ormana sahip olursun.

