Voxel Displacement Renderer – रेट्रो 3D सौंदर्यशास्त्र का आधुनिकीकरण
(blog.danielschroeder.me)- Daniel Schroeder एक real-time renderer विकसित कर रहे हैं, जो 90s के 3D games की pixelated surface feel को छोटे voxel surface details तक विस्तार देता है, और input assets के रूप में परिचित low-poly triangle mesh और textures का उपयोग करता है
- पूरे scene को voxel grid में बदलने के बजाय, displacement map से केवल surface को voxel जैसा दिखाया जाता है, ताकि Doom, Quake, Duke Nukem जैसी static environments के लिए visual style हासिल हो सके
- CPU triangle mesh और सीमित displacement जानकारी को GPU के लिए geometry data में बदलता है और textures को preprocess करता है, जबकि frame rendering GPU लगभग स्वतंत्र रूप से संभालता है
- Demo Radeon RX 5700 XT पर 1440p में 4–9ms frame time दिखाता है, और Steam Deck OLED के 800p पर 60FPS से ऊपर तथा कई हिस्सों में 90FPS locked तक पहुंचता है
- Environment को अब भी triangle mesh के रूप में संभाला जा सकता है, इसलिए collision, character controller और pathfinding मौजूदा physics libraries और mesh-based processing से हल हो जाते हैं; केवल कुछ जरूरी systems को voxel detail geometry की awareness चाहिए
90s 3D aesthetics को voxel surfaces तक विस्तार
- लक्ष्य classic 90s 3D games की simple environment geometry और crisp texture boundaries बनाए रखते हुए surface पर blocky 3D detail जोड़ना है
- Doom, Quake, Duke Nukem जैसे early-to-mid 90s 3D games ने technology और gameplay दोनों पर बड़ा असर डाला, और हाल में उस समय की visual limitations ही retro charm के रूप में स्वीकार की जा रही हैं
- शुरुआत इस सवाल से होती है: “pixels की जगह voxels से surface detail बनाई जाए तो कैसा होगा?”
- उदाहरण के लिए, cobblestone wall पास से देखने पर भी pixelated feel बनाए रखते हुए geometric depth रख सकती है
- Result को 90s games के look और ज्यादा modern expression के बीच स्थित करने के लिए design किया गया है
सामान्य voxel approach की सीमाएं
- सामान्य voxel mesh एक 3D grid होता है, जिसमें हर cube-shaped cell के filled या empty होने की जानकारी होती है
- Minecraft की तरह बड़े voxels पर textures लगाए जा सकते हैं
- Teardown की तरह छोटे, single-color voxels भी इस्तेमाल किए जा सकते हैं
- Voxel-based environment बनाने के लिए सारी geometry को shared grid में रखना पड़ता है, या कई independent voxel meshes को उसी space में place करना पड़ता है
- Voxel geometry को सीधे बनाने वाले tools मौजूद हैं, लेकिन creation process लंबा होता है और अक्सर छोटे meshes बनाने तक सीमित रहता है
- Tiled walls या floors जैसे building blocks बनाकर बड़ी structures assemble की जा सकती हैं, लेकिन यह grid-aligned buildings के लिए ठीक बैठता है, freeform terrain के लिए नहीं
- Procedural generation natural environments और building-block combinations के लिए उपयोगी है, लेकिन इसकी अपनी कठिनाइयां हैं और यह केवल कुछ खास तरह के games के लिए उपयुक्त है
- Existing triangle mesh को voxel grid में rasterize भी किया जा सकता है, लेकिन resulting geometry एक voxel grid पर आ जाती है, जिससे अवांछित aesthetic results पैदा हो सकते हैं
- Axis-aligned faces flat voxel slabs जैसी दिख सकती हैं, और 45-degree faces stair steps जैसी दिख सकती हैं
- अगर scene का canonical representation voxel बन जाए, तो rendering ही नहीं, physics, character controller, NPC pathfinding जैसी game logic भी voxel level पर operate करनी पड़ सकती है
- इसके बदले Minecraft और Teardown की तरह voxel mesh में geometry जोड़ना या हटाना आसान होने का फायदा मिलता है
सामान्य displacement approach की सीमाएं
- Displacement mapping texture के साथ displacement map का उपयोग करता है, जो define करता है कि texture का हर pixel mesh surface से अंदर या बाहर कितना move करेगा
- 3D modeling software mesh को subdivide करने के बाद नए vertices को move करके displacement को real geometry बना सकता है
- यह तरीका object silhouette को भी प्रभावित करता है
- Resulting mesh का polygon count बहुत बढ़ जाता है
- Hard edges या corners वाले input mesh को अच्छे result के लिए modify करना पड़ता है
- Real-time graphics में parallax occlusion mapping जैसे surface shading effects से actual shape बदले बिना detailed geometry जैसा दिखाया जा सकता है
- बड़े floors और walls पर यह अच्छा दिख सकता है
- Object edges पर geometry अब भी flat रहती है, जिससे illusion टूट जाता है
- shell mapping एक middle-ground approach है, जिससे highly subdivided mesh के बिना भी object silhouette पर displacement दिख सकता है
- Input mesh के high-curvature areas में इसे handle करना कठिन है
- Hard edges या corners वाले input mesh को इस technique के अनुरूप बनाना भी आसान नहीं है
Implementation approach: voxels और displacement mapping का मेल
- यह renderer classic 3D games जैसी environments को low-poly triangle mesh के रूप में बनाता है, displacement map से voxel-scale surface details define करता है, और उन्हें ऐसे render करता है जैसे वे वास्तविक voxels से assembled हों
- चूंकि target ऐसी environments हैं जिनमें building corners जैसे कई sharp edges होते हैं, इसलिए उन areas में भी voxel-like results चाहिए जहां सामान्य displacement mapping संघर्ष करती है
- मौजूदा implementation एक standalone C++ / Vulkan project है
- Infrastructure तीन मुख्य काम करता है
- Triangle mesh और सीमित displacement map information लेकर, GPU द्वारा deformed mesh draw करते समय उपयोग किए जाने वाले geometry data में convert करता है
- यह process frame rendering से पहले CPU पर चलता है
- Release game में results को disk पर bake किया जा सकता है
- Video की पूरी demo environment conversion single thread पर 0.5 seconds लेती है
- Textures को preprocess करके rendering के दौरान जरूरी normal maps जैसी information generate करता है
- काम अपने आप में basic है, लेकिन धीमा है, इसलिए baking उपयुक्त है
- Generated mesh और texture state का उपयोग करके GPU पर voxel displacement geometry draw करता है
- Per-frame CPU involvement लगभग नहीं है
- Triangle mesh और सीमित displacement map information लेकर, GPU द्वारा deformed mesh draw करते समय उपयोग किए जाने वाले geometry data में convert करता है
- Performance पहले से practical-use level पर है
- Radeon RX 5700 XT पर demo sequence 1440p में 4–9ms frame time के साथ render होता है
- यह 250–110FPS के बराबर है
- Steam Deck OLED के native 800p पर यह 60FPS से ऊपर बना रहता है, और कई sections 90FPS पर locked रहते हैं
Art asset creation workflow
- Content creation के लिए दो तरह के assets चाहिए: textures और mesh
- हर texture albedo map और displacement map के रूप में बनाया जाता है
- Albedo retro games के limited palette की नकल करे तो visual style को ज्यादा convincing बनाने में मदद मिलती है
- Displacement map fine height values देता है, और renderer में scale adjust करके intensity बदली जा सकती है
- Scale adjustment के बाद height unit का अर्थ है surface को अंदर या बाहर कितने voxels move करना है
- Renderer केवल nearest integer voxel unit तक displacement करता है, लेकिन exact height values normal map calculation में इस्तेमाल होती हैं
- एक voxel से छोटे features भी lighting को प्रभावित कर सकते हैं
- Mesh shading normals वाला एक सामान्य low-poly texture-mapped triangle mesh है
- Normals बताते हैं कि कौन-सा हिस्सा smoothly curved surface है और कौन-सा edge sharp है
- Renderer sharp edges पर अच्छे results बनाने के लिए extra work करता है
- Visual style के लिए texture mapping के समय voxel size को consistent रखने की कोशिश की जाती है, लेकिन यह जरूरी condition नहीं है
- Mesh structure और texture mapping पर कुछ restrictions हैं
- कुछ restrictions भविष्य में हटाई जा सकती हैं
- कुछ restrictions renderer के working method के कारण avoid नहीं की जा सकतीं
- Assets dedicated voxel representation नहीं, बल्कि triangle meshes हैं, इसलिए इन्हें कई tools से बनाया जा सकता है
- Demo environment Blender में model किया गया है
- अभी Blender से demo के लिए export format OBJ file है
Game development में फायदे और scope
- यह approach special voxel editing tools की बजाय familiar workflow से content बनाने देती है
- अच्छे textures बनाना कठिन हो सकता है, लेकिन एक बार बन जाने पर उन्हें कई geometries में reuse करना आसान है
- Video demo की geometry का बड़ा हिस्सा तीन colors वाले single stone block texture का उपयोग करता है
- Environment triangle mesh के रूप में बनाई जाती है और voxel features surface decoration हैं, इसलिए सुविधा होने पर environment को polygon geometry की तरह treat किया जा सकता है
- Demo application first-person movement, collision, stair climbing और wall collision support करता है
- अपना physics engine या character controller नहीं लिखा गया
- Open-source Jolt Physics integrate किया गया है
- Original triangle mesh को collision geometry के रूप में उपयोग किया गया है
- Enemy movement और pathfinding भी उसी mesh के आधार पर हल किए जा सकते हैं
- केवल कुछ gameplay systems को voxel-aware होना पड़ता है
- उदाहरण के लिए, first-person shooter में bullets को displaced geometry के exact shape का पालन कराने के लिए displacement-aware raycast function implement किया जा सकता है
- कई voxel-based games में कई game systems custom-build करने पड़ते हैं, इसलिए वे अपना engine इस्तेमाल करते हैं, लेकिन इस approach में rendering के अलावा अधिकांश logic को voxel-scale details जानने की जरूरत नहीं होती
- Existing engine में इस rendering technique को integrate करना सबसे realistic direction है
बाकी चुनौतियां और next steps
- मौजूदा implementation level geometry production के लिए अच्छी तरह फिट है, लेकिन game environments को छोटे objects, decorations और enemies जैसे dynamic elements भी चाहिए
- आगे छोटे objects या animated objects को इस art style में integrate करने का तरीका जोड़ने की योजना है
- Demo की lighting पहले से अच्छी दिखती है, लेकिन current implementation में limitations हैं
- केवल कम संख्या में lights support हैं
- Shadows, ambient occlusion और अधिक advanced features नहीं हैं
- यह renderer सामान्य voxel games जैसी बहुत dynamic geometry के बजाय, ज्यादातर games में मौजूद काफी हद तक static environments को target करता है
- Specific application needs के अनुसार baking methods समेत lighting handling के लिए कई possibilities हैं
- अभी anti-aliasing नहीं है, और यह खासकर दूर के floors पर noticeable है
- Project की future plans और developers/studios के लिए discussion दूसरे लेख में जारी है
1 टिप्पणियां
Hacker News राय
शायद इसलिए कि मैं इतना पुराना हूं कि 2400 baud modem पर गेम डाउनलोड करने के दिन याद हैं, यह aesthetic मुझे वाकई बहुत आकर्षक लगता है
वीडियो भी शानदार था और निजी तौर पर इसने बहुत गहरा माहौल जगा दिया
जहां छत बहुत नीची थी, वहां claustrophobia और घुटन तक महसूस हुई, और चट्टान व रेतीले फर्श वाली गुफाएं, चट्टानों वाली गुफाएं इतनी खूबसूरत थीं कि इस renderer से बना कोई Myst या LucasArts-स्टाइल adventure game खेलने का मन हो गया
यह गुफा-exploration या archaeological excavation जैसे विषयों पर खूब जंचेगा
falling sand engine को 3D में बढ़ाने के लिए smooth particle hydrodynamics जैसा तरीका भी इस्तेमाल किया जा सकता है
नीची छत वाले हिस्सों में छत से लटके blocks physics के नियमों को तोड़ते हुए लग रहे थे
https://web.archive.org/web/20240524065427/https://blog.dani...
https://www.youtube.com/watch?v=1xFEbXWstCM
एक अलग approach के तौर पर Deep Bump है। यह उसी समस्या को बिल्कुल अलग तरीके से संभालता है
Deep Bump texture images से plausible normal maps बनाने वाला machine learning tool है
यह इस voxel displacement renderer में इस्तेमाल होने वाले stone या brick textures के लिए खास तौर पर अच्छा बैठता है, और fabric textures में भी folds, pockets, collars को कुछ हद तक पहचानकर depth दिखाने वाले normals देता है
tree bark पर ठीक-ठाक है और plants पर खास नहीं, शायद training dataset के असर से
Doom/Wolfenstein तरह के games को modernize करना हो तो इस्तेमाल करने लायक open-source tool पहले से मौजूद है
[1] https://github.com/HugoTini/DeepBump
यह लेख displacement maps को छोटे voxel-based representation की तरह handle करने के ज्यादा करीब है, और Deep Bump जैसे tools यहां बताए system के लिए texture assets बनाने में सहायक तौर पर काम आ सकते हैं
क्योंकि वे actual geometry नहीं बदलते, सिर्फ lighting और depth के illusion को बदलते हैं, इसलिए mesh edges से देखने पर displacement अब भी ज्यादा high-quality विकल्प है
हालांकि DeepBump शायद traditional displacement में इस्तेमाल होने वाला 1D height map, यानी full 3D vector displacement नहीं बल्कि सिर्फ height वाला map extract करने में काम आ सकता है
शानदार तो है, लेकिन सोच रहा हूं कि यह approach animated 3D models पर कितनी अच्छी बैठेगी
ज्यादा से ज्यादा Doom के “Voxel Doom” mod जैसी दिखेगी शायद
[1] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
[2] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
“अब जब यह context समझा दिया है, मैं classic Doom के Voxel Doom mod की तारीफ करना चाहता हूं। mod creator ने game के monsters और दूसरे sprites को voxel meshes में बदलकर depth जोड़ी, और यह सचमुच प्रभावशाली काम था। इसके बाद 2022 के अंत में उसने level geometry में voxel detail जोड़ने के लिए parallax mapping के साथ experiment शुरू किया। मेरे हिसाब से यह हिस्सा उतना अच्छा नहीं दिखा, creator के artwork की वजह से नहीं, बल्कि parallax mapping से render करते समय आने वाली मूलभूत सीमाओं की वजह से। यह mod मेरे project की inspiration नहीं था। मैं पहले से काम कर रहा था। लेकिन उस mod को online अच्छी प्रतिक्रिया मिलते देखकर मुझे अपना काम जारी रखने में बहुत ताकत मिली। ↩”
approach खुद animated doors जैसी चीजें भी support करता है, तो mesh और texture flipbook को मिलाकर original Doom जैसे दिखने वाले monsters पर भी इस्तेमाल हो सकता है
हालांकि sharp curvature वाले areas में shell mapping में artifacts सबसे ज्यादा खराब होंगे, और level meshing की limitations का भी जिक्र है, इसलिए शायद नहीं भी
Notch जिस पर काम कर रहा है, उससे यह काफी मिलता-जुलता दिखता है। उसके Twitter feed में देखें तो वह एक और तरह की voxel rendering कर रहा है
हालांकि यह C++/Vulkan इस्तेमाल करता है और वाकई शानदार दिखता है
सोच रहा हूं कि यह approach Unreal Engine 5 Nanite से कैसे compare होती है। शायद Unreal Engine भी कुछ ऐसा ही कर रहा हो
पुराने games, जैसे Comanche[1], में voxels इस्तेमाल करने की एक motivation मुझे याद है कि triangle mesh से model करने पर समान hardware पर ज्यादा महंगे पड़ने वाले complex terrain को believable तरीके से हासिल किया जा सकता था
author RX 5700 XT पर 110FPS का जिक्र करता है, लेकिन दूसरे approaches की तुलना में यह किस स्तर का है, यह मुझे ठीक से नहीं पता
[1] https://en.wikipedia.org/wiki/Comanche_(video_game_series)
Nanite high-polygon objects बनाने को मानकर चलता है, और rendered triangles pixels से छोटे न हो जाएं, इसके लिए simplified chunks stream करता है
geometry को naturally बहुत detailed बनाया जा सकता है, इसलिए displacement map कुछ हद तक redundant हो जाता है, और उसे texture map से handle करने की खास वजह नहीं रहती
बेशक terrain के लिए अलग case है, लेकिन वह special case है
इस लेख का तरीका displacement और low-polygon mesh का इस्तेमाल करके load time पर high-polygon लेकिन “voxelized” geometry generate करता हुआ लगता है
याद के मुताबिक Comanche ने terrain rendering के लिए ray tracing जैसा approach इस्तेमाल किया था[1]
यह असली voxel नहीं था, बल्कि sample किया जाने वाला 2D height map था
नाम “VoxelSpace” रखा गया था, इसलिए भ्रम होना स्वाभाविक है
[1] https://github.com/s-macke/VoxelSpace
आम धारणा के उलट, उन गेम्स ने असली 3D voxels इस्तेमाल नहीं किए थे; उन्होंने terrain texture में color और height values सेव किए हुए height map को ray marching से render किया था
shader में texture की ओर ray march करने से वही look फिर से बनाया जा सकता है, और यह ब्लॉग पोस्ट में मिले नतीजे से बहुत मिलता-जुलता दिखेगा
वहीं Nanite एक GPU-driven rendering तकनीक है जो target quality के हिसाब से triangle density को adjust करती है
Nanite displacement maps और tessellation इस्तेमाल कर सकता है, लेकिन वह एक अलग path इस्तेमाल करता है जो high-polygon assets को सीधे डालकर render करने की तुलना में जरूरी नहीं कि ज्यादा efficient हो
voxel क्षेत्र में नए तरीकों को देखना हमेशा अच्छा लगता है
हालांकि लेख में voxels और किसी खास rendering technique को मिलाकर बताना थोड़ा खटकता है
voxel बस 3D grid का इस्तेमाल करना है, और बीच के हिस्से को देखकर लगता है कि लेखक voxel use को cube-style rendering, जिसे आम तौर पर Minecraft-style blockxel renderer कहा जाता है, के बराबर मान रहे हैं
वे यह भी कहते हैं कि triangle geometry को import करके engine में सीधे इस्तेमाल किया जा सकता है, लेकिन शायद यह भूल जाते हैं कि blockxel या दरअसल कोई भी rendering process यही काम कर सकता है
अलग styles इस्तेमाल करने वाले आम voxel rendering plugins को मौजूदा engines में first-class support मिलने का तरीका भी यही है
काश यह open source होता। सच में काश ऐसा होता
सच में पसंद आया। Ultima Underworld याद आ गया
retro 3D games के modernization का भविष्य यही होना चाहिए। सचमुच खूबसूरत है