Skip to content

ब्राउज़र में open world बनाना, भाग 6: Clipmaps ने कहानी बदल दी

लिखा है Oleg Sidorkin ने, Cinevva के CTO और को-फाउंडर

यहाँ नए हैं? सीरीज़ गाइड देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।

Spike 10 से पहले हमारे दिमाग़ में मॉडल अब भी यही था कि "बड़ी दुनिया का मतलब ज़्यादा geometry।" Spike 10 के बाद मॉडल बन गया "constant geometry budget, camera पर केंद्रित ring updates।" इस बदलाव ने प्रोजेक्ट की दिशा बदल दी।

Geometry clipmaps के पीछे का विचार सीधा है। आप terrain को camera पर केंद्रित concentric rings के एक सेट के रूप में render करते हैं। सबसे अंदरूनी ring में सबसे ज़्यादा vertex density होती है। बाहर की तरफ़ हर ring k vertex spacing को दोगुना कर देती है, sk=s02k, इसलिए वह अपने अंदरूनी ring से 4× ज़मीन के इलाक़े को कवर करती है।

यही दोगुना करना पूरा खेल है। View distance rings की संख्या के साथ geometrically बढ़ती है, dviews02L, जबकि vertex की cost सिर्फ़ linearly बढ़ती है:

VtotalN2L

जहाँ L rings हैं और हर एक में N×N vertices हैं। आप जितनी दूर देख सकते हैं उसे दोगुना करने की कीमत एक और ring है, geometry का चार गुना नहीं। Triangle count दुनिया के आकार चाहे जो हो, लगभग constant रहता है, क्योंकि आप हमेशा वही L rings उसी resolution पर render करते हैं।

Spike 10 को नए tab में खोलें ↗ · सोर्स देखें

असली काम का तरीक़ा ring boundaries पर geomorphing था। जब कोई vertex एक LOD ring से अगले में जाता है, तो उसकी height को high-res और low-res sample के बीच smoothly blend होना ज़रूरी है। इसके बिना, जब भी camera हिलती है और rings खिसकती हैं, आपको हर बार दिखने वाले pops मिलते हैं। हमने इसे vertex की ring edge से दूरी पर आधारित एक blend factor से संभाला, और vertex shader में height को interpolate किया:

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

जहाँ d camera से vertex की दूरी है। ring के अंदर (ddnear) vertex अपनी पूरी-resolution height इस्तेमाल करता है; जब तक यह अगली ring तक पहुँचता है (ddfar) तब तक यह उस coarse height पर पहुँच चुका होता है जिसे वह ring इस्तेमाल करेगी, इसलिए pop होने को कुछ बचता ही नहीं।

एक बारीक सबक़ camera movement testing से आया। Static screenshots में clipmaps को परखना आसान है और transition artifacts से चूक जाना भी। हमने ring boundaries के आर-पार constant-speed traversals चलाने और temporal noise पर नज़र रखने में समय लगाया। Screenshots ने झूठ बोला। Motion ने सच बताया।

इस spike ने हमें एक साफ़ architectural boundary भी दी। Near-field terrain समय के साथ dynamic और महँगा बन सकता था, volumetric editing, ज़्यादा material complexity, और physics interaction के साथ। Far-field terrain stable, अंदाज़ा लगाने लायक़, और सस्ता रह सकता था। वह अलगाव इस बिंदु से आगे के हर architectural फ़ैसले की रीढ़ बन गया।

अगर आप अपने प्रोजेक्ट के लिए clipmaps को परख रहे हैं, तो stress loops test कीजिए, beauty shots नहीं। लंबे traversal paths, बदलती camera altitude, और बार-बार boundary crossings ही असली समस्याओं को उजागर करते हैं।

भाग 7 में हम volumetric meshing जोड़ते हैं और "terrain एक surface के रूप में" से "terrain एक editable volume के रूप में" की ओर बढ़ते हैं। यही वह बिंदु था जहाँ यह प्रोजेक्ट एक renderer होना बंद हुआ और एक world editor बनना शुरू हुआ।

इस अध्याय में बताई गई technology

Geometry clipmaps. Losasso और Hoppe ने SIGGRAPH 2004 में पेश की (paper), geometry clipmaps terrain को camera पर केंद्रित concentric square rings के रूप में render करती हैं। हर ring पिछली से दोगुने इलाक़े की होती है, आधी vertex resolution पर। कुल vertex count constant होता है: लगभग N2LN=256 और L=8 levels के साथ, यह 2562×8524,000 vertices है, दुनिया का आकार चाहे जो हो। camera हिलने पर CPU हर ring के लिए heightmap data update करता है। vertex shader एक texture से height पढ़ता है और flat grid को displace करता है। हमारी geometry clipmaps पर landscape गाइड और GPU Gems 2, Chapter 2 देखिए।

Geomorphing. Terrain LOD में सबसे बड़ा visual artifact popping है: जब कोई patch LOD level बदलता है तो vertices अचानक कूद जाते हैं। Geomorphing इसे एक transition zone के दौरान LOD levels के बीच vertex positions को blend करके ख़त्म कर देता है। हर vertex अपनी current-LOD height और अपनी coarser-LOD height, दोनों स्टोर करता है। camera की दूरी पर आधारित एक morph factor उनके बीच smoothly interpolate करता है: morphedHeight = mix(fineLodHeight, coarseLodHeight, smoothstep(lodNear, lodFar, distance))। transition zone आम तौर पर हर ring का बाहरी 20% होता है। सामान्य camera speeds पर, transition अदृश्य रहता है। geomorphing की बारीकियाँ देखिए।

CDLOD (Quadtree-Adaptive Clipmaps). Strugar (2014, paper) द्वारा fixed-ring clipmaps में एक सुधार। एक समान resolution वाली concentric rings के बजाय, CDLOD एक quadtree इस्तेमाल करता है जो terrain की complexity के मुताबिक़ ढल जाता है। समतल इलाक़े coarse nodes इस्तेमाल करते हैं, जबकि ज़्यादा detail वाले इलाक़ों (cliffs, ridges) को बारीक subdivision मिलता है। यह creator worlds के लिए मायने रखता है जहाँ अलग-अलग chunks की complexity बहुत अलग होती है। हमारी landscape गाइड में CDLOD देखिए।


12 में से भाग 6।
पिछला: भाग 5 - सुंदर चीज़ों का बजट बनाना
अगला: भाग 7 - Marching cubes और पहली असली गुफाएँ
सीरीज़ गाइड: /hi/blog/2026-02-25-open-world-browser-series-guide