Skip to content

Tarayıcıda açık dünya oluşturmak, bölüm 6: Clipmap'ler gidişatı değiştirdi

Yazan: Oleg Sidorkin, Cinevva CTO'su ve Kurucu Ortağı

Burada yeni misiniz? Seri rehberine göz atın. Bu rehber, spike'ın ne olduğunu açıklar ve tüm bölümlere bağlantı verir.

Spike 10'dan önce zihinsel modelimiz hâlâ "daha büyük dünya, daha fazla geometri demektir" şeklindeydi. Spike 10'dan sonra modelimiz "sabit geometri bütçesi, kamera merkezli halka güncellemeleri" hâline geldi. Bu değişim projenin gidişatını değiştirdi.

Geometri clipmap'lerinin ardındaki fikir basittir. Araziyi, kameranın merkezinde bulunduğu bir dizi eş merkezli halka olarak render edersiniz. En içteki halka en yüksek köşe yoğunluğuna sahiptir. Dışarı doğru her k halkasında köşe aralığı iki katına çıkar, sk=s02k; dolayısıyla kendisinden içerideki halkanın kapladığı zemin alanının 4× katını kapsar.

İşin püf noktası tamamen bu iki katına çıkışta. Görüş mesafesi halka sayısıyla geometrik olarak artarken, dviews02L, köşe maliyeti yalnızca doğrusal olarak büyür:

VtotalN2L

Burada her biri N×N köşeden oluşan L halka bulunur. Görebildiğiniz mesafeyi iki katına çıkarmanın maliyeti, dört kat fazla geometri değil, yalnızca bir halkadır. Dünya boyutu ne olursa olsun üçgen sayısı yaklaşık olarak sabit kalır; çünkü aynı çözünürlükteki aynı L halkayı her zaman render edersiniz.

Spike 10'u yeni sekmede aç ↗ · Kaynak kodunu görüntüle

Pratikteki püf noktası, halka sınırlarında geomorphing uygulamaktı. Bir köşe bir LOD halkasından diğerine geçtiğinde yüksekliğinin, yüksek çözünürlüklü ve düşük çözünürlüklü örnekler arasında yumuşak biçimde harmanlanması gerekir. Aksi takdirde kamera her hareket ettiğinde ve halkalar kaydığında gözle görülür sıçramalar oluşur. Bunu, köşenin halka kenarına olan uzaklığına dayalı bir harmanlama faktörüyle ve yüksekliği vertex shader'da interpolasyon yaparak çözdük:

h=lerp(hfine,hcoarse,α),α=smoothstep(dnear,dfar,d)

Burada d, köşenin kameraya olan uzaklığıdır. Halkanın içinde (ddnear) köşe tam çözünürlüklü yüksekliğini kullanır; bir sonraki halkaya ulaştığında (ddfar), o halkanın kullanacağı kaba yüksekliğe zaten geçmiş olur. Dolayısıyla sıçrayacak hiçbir şey kalmaz.

Kamera hareketi testlerinden incelikli bir ders çıkardık. Clipmap'leri statik ekran görüntüleri üzerinden değerlendirip geçiş bozulmalarını gözden kaçırmak kolaydır. Halka sınırları boyunca sabit hızla ilerleyen geçişleri uzun süre çalıştırıp zamansal gürültüyü gözlemledik. Ekran görüntüleri yalan söyledi. Hareket gerçeği gösterdi.

Bu spike bize aynı zamanda net bir mimari sınır kazandırdı. Yakın alan arazisi; hacimsel düzenleme, daha yüksek malzeme karmaşıklığı ve fizik etkileşimiyle zaman içinde dinamik ve maliyetli hâle gelebilirdi. Uzak alan arazisi ise kararlı, öngörülebilir ve düşük maliyetli kalabilirdi. Bu ayrım, bu noktadan sonraki tüm mimari kararların omurgasını oluşturdu.

Kendi projeniz için clipmap'leri değerlendiriyorsanız güzel görüntüleri değil, stres döngülerini test edin. Gerçek sorunları ortaya çıkaran şeyler; uzun geçiş rotaları, değişen kamera yüksekliği ve sınırların tekrar tekrar aşılmasıdır.

  1. bölümde hacimsel mesh oluşturmayı ekliyor ve "yüzey olarak arazi" yaklaşımından "düzenlenebilir hacim olarak arazi" yaklaşımına geçiyoruz. Projenin bir renderer olmaktan çıkıp dünya editörüne dönüşmeye başladığı nokta buydu.

Bu bölümde değinilen teknolojiler

Geometri clipmap'leri. Losasso ve Hoppe tarafından SIGGRAPH 2004'te tanıtılan (makale) geometri clipmap'leri, araziyi kameranın merkezinde bulunduğu eş merkezli kare halkalar olarak render eder. Her halka, bir öncekinin yarısı kadar köşe çözünürlüğüyle iki kat alan kaplar. Toplam köşe sayısı sabittir: yaklaşık N2L. N=256 ve L=8 seviye için bu, dünya boyutundan bağımsız olarak 2562×8524,000 köşe demektir. Kamera hareket ettikçe CPU, her halkanın heightmap verilerini günceller. Vertex shader, yüksekliği bir dokudan okur ve düz ızgarayı yerinden oynatır. Geometri clipmap'leri hakkındaki arazi rehberimize ve GPU Gems 2, Bölüm 2'ye bakabilirsiniz.

Geomorphing. Arazi LOD'undaki en belirgin görsel bozulma sıçramadır: Bir parça LOD seviyesini değiştirdiğinde köşeler bir anda yer değiştirir. Geomorphing, bir geçiş bölgesi boyunca köşe konumlarını LOD seviyeleri arasında harmanlayarak bunu ortadan kaldırır. Her köşe hem mevcut LOD yüksekliğini hem de daha kaba LOD yüksekliğini saklar. Kamera mesafesine dayalı bir morph faktörü, ikisi arasında yumuşak bir interpolasyon yapar: morphedHeight = mix(fineLodHeight, coarseLodHeight, smoothstep(lodNear, lodFar, distance)). Geçiş bölgesi genellikle her halkanın dıştaki %20'lik kısmıdır. Normal kamera hızlarında geçiş fark edilmez. Geomorphing ayrıntılarına bakabilirsiniz.

CDLOD (Quadtree Uyarlamalı Clipmap'ler). Strugar'ın sabit halkalı clipmap'ler üzerinde yaptığı bir iyileştirmedir (2014, makale). CDLOD, tekdüze çözünürlüğe sahip eş merkezli halkalar yerine arazi karmaşıklığına uyarlanan bir quadtree kullanır. Düz alanlarda kaba düğümler kullanılırken, yüksek ayrıntıya sahip alanlar (uçurumlar, sırtlar) daha ince alt bölümlere ayrılır. Farklı chunk'ların çok farklı karmaşıklık düzeylerine sahip olduğu üretici dünyaları için bu önemlidir. Arazi rehberimizdeki CDLOD bölümüne bakabilirsiniz.


12 bölümün 6.'sı.
Önceki: Bölüm 5 - Görselliğin bütçesini belirlemek
Sonraki: Bölüm 7 - Marching cubes ve ilk gerçek mağaralar
Seri rehberi: /tr/blog/2026-02-25-open-world-browser-series-guide