Son olarak, birçok araştırmadan sonra, bazılarının daha önce de söylediği gibi, evrensel olarak “en iyi” yöntem olmadığını söyleyebilirim. Ancak araştırmam beni şu şeylerin bilgisine götürdü:
Ağa bağlı olarak sonunda kullanacaksınız:
- Sahte Küp: Çeyrek uygulamalı herhangi bir LOD yöntemi gayet iyi sonuç verir, sadece yüzler arasındaki sınırlar gibi özel durumlara dikkat etmeniz gerekir, bu durumda, Çeyreğinizin her seviyedeki komşuları gösteren işaretçi olması gerekir.
- Diğerleri: ROAM'ın (daha yeni sürüm 2.0 veya BDAM, CABTT veya RUSTIC gibi başka bir uzantı) iyi olacağını düşünüyorum, ancak bu algoritmaların çalışması zor, daha fazla bellek gerektiriyor ve küplü diğer yaklaşımlardan biraz daha yavaşlar.
Uygun olabilecek birçok LOD yöntemi var, ancak benim kişisel ilk 5’im:
- Sürekli Mesafeye Bağlı LOD (CDLOD)
- GPU Tabanlı Geometri Klipsleri (GPUGCM)
- Yığın LOD
- OpenGL GPU Tessellation ile Terinlerin Oluşturulması (Kitap: OpenGL Insight, Bölüm 10)
- Geometrik MipMapping
Her biri, arazileri işlemek için benzersiz bir yol sunar; örneğin, CDLOD, gölgelendiricileri (GLSL veya HLSL) kullanarak çok kolay bir uygulamaya sahiptir, ancak aynı zamanda Planet Rendering'in amacı, patlamak için CPU'da (eski donanım için) de uygulanabilir. en önemlisi GPU'larda en iyisidir, bu nedenle GPU'nuzu sıkmak istediğinizde GPUGCM en iyisidir. Her ikisi de geniş arazilerin veri tabanlı, prosedürel veya karma (sabit verilere veya yükseklik haritalarına dayanan arazi ve prosedürel çalışmayla eklenen detay) dayanmasıyla çok iyi çalışır.
Ayrıca, temel Geometrik Klip Haritaları yöntemine küresel uzantı mevcuttur, ancak bazı problemleri vardır, çünkü yükseklik haritasının düzlemsel örnekleri küresel koordinatlar kullanılarak parametrelendirilmelidir.
Öte yandan Chunked LOD, eski donanımlar için mükemmeldir, çalışmak için herhangi bir GPU tarafı hesaplamasına gerek duymaz, büyük veri kümeleri için mükemmeldir ancak gerçek zamanlı olarak prosedür verilerini kaldıramaz (belki de bazı değişikliklerde olabilir)
Tessellation shader'ları kullanmak çok yeni bir tekniktir, OpenGL 4.x çıktığından beri, bence en iyisi olabilir, fakat Planet Rendering hakkında konuşuyoruz, diğer yöntemlerin çok kolay bir şekilde ele alabileceği bir problemle karşı karşıyayız. hassasiyet hakkında.
Hassasiyetinizin sadece verticiler arasında 1 km olmasını istemediğiniz sürece, Mozaik değiştirme shaderlerine gidin. Bu yöntemle gerçekten büyük arazilerdeki problem, jitterin çözülmesi zor olması (ya da en azından benim için, mozaik gölgelendiricilere yeni başladığım için).
Geomipmapping harika bir tekniktir, dörtlü alandan yararlanır ve düşük bir tahmin edilen piksel hatası vardır, ancak gezegen oluşturma için en az 16+ detay seviyesi ayarlamanız gerekecek, bu da (dikişleri dikmek için) bazı ekstra yamalar yapmanız gerekeceği anlamına geliyor farklı seviyelerde bağlantı kurmak ve komşunuzun seviyesine dikkat etmek için, özellikle 6 arazi yüzünü kullanarak, bunu çözmek için can sıkıcı olabilir.
Kendi içinde çok özel olan bir başka yöntem daha var: “Gezegensel Alan İçin Projektif Izgara Haritalaması” görselleştirme için mükemmel, ancak daha fazla bilgi edinmek istiyorsanız, bağlantıya dezavantajları var.
sorunlar:
Jitter : Günümüzdeki GPU'ların çoğu gezegen ölçeğindeki arazilerde büyük pozisyonları manipüle etmek için yeterli hassasiyet sağlamayan sadece 32 bit kayan nokta değerlerini destekliyor. Jitter, izleyici yakınlaştırdığında ve döndürdüğünde veya hareket ettiğinde meydana gelir, ardından çokgenler ileri geri sıçramaya başlar.
Bunun için en iyi çözüm "GPU Kullanarak Göze Göre Rendering" yöntemini kullanmaktır. Bu yöntem, "Sanal Dünyalar İçin 3B Motor Tasarımı" kitabında (internette bulabildiğinizden eminim), temel olarak tüm pozisyonlarınızı CPU'da iki katına ayarlamak zorunda kaldığınız (yamalar, klipsler, nesneler) Frustrum, kamera, vb.) ve ardından MV, izleyicinin etrafında çevirisini (0, 0, 0) T olarak ayarlayarak ortalanır ve çiftler, iki yüzgecin fraksiyon (mantis) bitleri kullanılarak sabit nokta gösterimi ile kodlanır. ve bazı yöntemlerle yüksek (Ohlarik'in uygulamasını ve DSFUN90 Fortran kütüphanesini kullanma hakkında okuyun).
Köşe gölgelendiricisi yalnızca bir iki çıkarma ve bir ekleme gerektirse de, GPU RTE, konumlar için gereken tepe tampon belleğinin miktarını ikiye katlar. Bu, yalnızca konumlar kaydedilmediği sürece bellek gereksinimlerini iki katına çıkarmaz.
Derinlik Tamponu Hassasiyeti : Z-kavgası. Çok büyük araziler oluşturduğumuz için, bu durumda: gezegenler, Z-tamponunun BÜYÜK olması gerekir, ancak znear ve zfar için ayarladığınız değerlerin önemi yoktur, her zaman problemler olacaktır.
Z-tamponu bir kayan nokta aralığına bağlı olduğundan ve aynı zamanda doğrusaldır (perspektif projeksiyonun doğrusal olmasa da) göze yakın değerler Z-savaşmasından muzdariptir, çünkü hassas 32-bitlik yüzdürme eksikliği vardır.
Bu sorunu çözmenin en iyi yolu "Logaritmik Derinlik Tamponu" kullanmaktır
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
Logaritmik derinlik tamponu, zscreen için logaritmik dağılım kullanarak uzak nesneler için derinlik tamponu hassasiyetini artırır. Uzak nesneler için hassasiyet için yakın nesneler için hassasiyet ticareti yapar. LOD yöntemi ile oluşturduğumuzdan uzak nesneler daha az hassasiyet gerektirir çünkü daha az üçgenleri vardır.
Bahsetmesi gereken önemli bir şey, Quadtree üssü nedeniyle fizik yaparken (çoğunlukla çarpışmalarda) listelenen tüm metotların (yansıtıcı ızgara hariç) çok iyi olması, yani bir oyun yapmayı planlıyorsanız zorunludur.
Sonuç olarak, mevcut tüm seçenekleri kontrol edin ve daha rahat hissettiğiniz bir tanesini seçin, bence CDLOD harika bir iş çıkarıyor. Jitter ve Z-buffer problemlerini çözmeyi unutmayın ve en önemlisi: bunu yaparken eğlenin!
LOD hakkında daha fazla bilgi için bu bağlantıyı kontrol edin .
Bir küpü sprifikasyon hakkında tam bir bilgi edinmek için bu bağlantıyı kontrol edin .
Jittering ve Z-Buffer hassasiyetlerini çözme hakkında daha iyi bir açıklama için bu kitabı kontrol edin .
Umarım bu küçük yorumu yararlı bulursunuz.