Gezegen oluşturma için en iyi LOD yöntemi hangisidir?


23

Şu anda tezim üzerinde çalışıyorum, gezegensel büyüklükteki arazileri yapan bir motor.

Araştırmamı hala bitirdim ve bu konuda birçok şeyle karşılaştım, sorun şu ki hangi Ayrıntı Seviyesi (LOD) yöntemini kullanmam gerektiğine karar veremem.

Geomipmapping, geometri clipmaps (GPU) ve Ulrich tarafından büyük arazilerde iyi çalışan ve bir küpün 6 ​​yüzünü oluşturmak için kullanılabilecek ve daha sonra bu yöntemi kullanarak küpü "füzeleştirmek" için kullanılabilecek ve LOD'u biliyorum. C ++ / OpenGL / GLSL kullanarak GPU'daki bu yöntemler (ROAM gibi yöntemler veya küp kullanmayan başka bir yöntem kullanılması, tekstüre etme nedeniyle ağrımın dışında kalıyor). Ayrıca son zamanlarda buradaki mozaikleme gölgelendiricileri kullanarak araziler oluşturma dersine girdim

Bu yüzden, ALL yöntemlerini uygulamak ve hangisinin gezegen ölçeği için en uygun ve hangisinin daha uygun olduğunu görmek için zamanım yok ve burada birisinin bu tür bir karşılaştırma yapıp yapmadığını ve hangi yönteme karar vermeme yardım etmesini istiyorum. uygulamalı mıyım ve kullanmalı mıyım (öğretmenim biraz çılgınca ve bir icosahedron ile bir şey yapmamı istiyor, ancak ROAM kullanmadan bu yöntemi anlayamıyorum)

Her neyse, karar vermemde yardımcı olabilirseniz veya başka bir öneri veya yönteminiz varsa, gerçekten minnettar olacağım. Bir koşul, CPU'nun tıkanmasını önlemek için yöntemin GPU tarafını (en azından çoğunda) uygulayabilmesi gerektiğidir.

Diğer bir talep ise, arazide çok fazla ayrıntı alırken yüzerlikle ilgili hassasiyetle ilgili sayısal problemler olduğunu bilmemdir, nasıl çözeceğimi bilmiyorum, bir forumda bir çözüm okudum ancak nasıl yapılacağını anlayamıyorum. uygulayın, bu parçanın izini kaybettim ve bu hassas problemin nasıl çözüleceğini bilmek istiyorum.

Şu anda float hassasiyetini, z-dövüş sorunlarını, dinamik z-değerleri ile frustum çökertme ve topakları için veri gösterimini çözmek için bazı matris dönüşümleri hakkında okuyorum (float'lar ile yama alanını ve dünyadaki koordinatlarını ikili olarak kullanmak). Hassas problemi kolayca çözebilirim. Bu proje için hangisinin daha iyi olduğuna karar vermek için LOD yöntemleri ile fikir ve önerileriniz arasında bir kıyaslamaya hala ihtiyacım var. Uygulama kalitesi, performans kalitesi vs performans zorluğunu hesaba katarsak, en iyisini istiyorum.

Bahsetmeyi unuttuğum bir şey, kuşağın melez olduğu, yani gezegeni tamamen GPU kullanarak (anında hesaplanan yükseklikler) ve / veya taban yükseklik haritası görüntüsünü kullanarak ve GPU (köşe ile detaylar) ekleyebilmem gerektiği anlamına geliyor. gölgelendirici). Tekstüre etmek bir yan kısım olacak, daha sonra başım belaya girecek, şu anda yüksekliğe bağlı olarak yalnızca renkler kullanmaktan veya parça gölgelendiricisinde oluşturulan bir tür gürültü dokusunu kullanmaktan mutluyum.


6
Evrensel olarak "en iyi" yöntem yoktur. Projenizin tüm gereksinimlerini yalnızca siz biliyorsunuz ve birçok LOD seçeneği hakkında bilginiz var. Sonunda, tezin bir parçası olduğundan bu kararı gerçekten kendin vermelisin. Tezin, okuduğun konu hakkındaki bilgini gösterir. İhtiyaçlarınız için hangisinin en iyisi olduğunu bilmiyorsanız, belki seçenekleri biraz daha incelemelisiniz.
MichaelHouse

@ Byte56 haklısın ve ben LOD yöntemleri hakkında çok araştırma yapıyordum, sadece bazılarını uygulayan başkalarının önerilerini görmek ve performans ve görsel kalite hakkında konuşmak istedim, böylece birisini seçebiliyorum ... yine de, teşekkürler yorumunuz için :) ve bu arada, şu anda mozaikleme gölgelendiricileri hakkında anlıyorum ve harika bir öğretici buldum (ana sorudaki bağlantı) ve sanırım bunun için gideceğim, sadece arazi oluşturma için açıklanmış, ancak değiştirebilirim 6 yüz yapmak ve küpü küreleştirmek için.
nosmirck

vterrain.org/LOD , arazi oluşturma konusunda birçok bilgi içermektedir. Bağlantılı kısım, ayrıntılı algoritmaların seviyesi için makaleleri ve diğer kaynakları listeler. vterrain.org/LOD/spherical.html küresel ızgaralarla (örn. gezegenler) ilgilenir.
Exilyth

@sarahm Biliyorum, başladığım yer var, hepsini reddederim ... Sadece hangisinin uygulanacağını seçmek için bazı LOD yöntemleri arasında bir karşılaştırmaya ihtiyacım var, hepsini gerçekten yapabilirim ama zamanım yok ... , Mozaik gölgelendiricilerin kullanıldığı metoda gidiyorum, yeni bir şey ve küresel yüzeylerde uygulama yapılmıyor :)
nosmirck

3
Zaten çok fazla araştırma yaptığınızı biliyorum ve bunun masaüstünüze denk gelip gelmediğinden emin değilim, ancak "Sanal Küre için 3D Motor Tasarımı: Patrick Cozzi ve Kevin Ring" konusuna bir göz atın - Çok buldum orada iyi pratik bilgi. İyi araştırılmış ve söylendiği gibi çok pratik bir bakış açısından ele alınmıştır. HTH bir şekilde.
Schoenobates

Yanıtlar:


17

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:

  1. Sürekli Mesafeye Bağlı LOD (CDLOD)
  2. GPU Tabanlı Geometri Klipsleri (GPUGCM)
  3. Yığın LOD
  4. OpenGL GPU Tessellation ile Terinlerin Oluşturulması (Kitap: OpenGL Insight, Bölüm 10)
  5. 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.


1
Araştırma yolculuğunuz hakkında daha fazla bilgi edinmek isterim. Yine de güncellemelerinizi takip edebilecek miyim? Blog falan mı?
Syaiful Nizam Yahya

@publicENEMY Şu an hala motoru geliştiriyorum, durdum çünkü bir yıllık bir işim var ve araştırmam bir iki ay içinde hazırdı, araştırmayı tekrar alıp motoru bitireceğim. Oraya vardığımda, tüm güncellemeleri yolculuğa ne zaman ekleyeceğimi size bildireceğim. İlginiz için teşekkürler.
nosmirck
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.