क्लासिक 3D वीडियोगेम शैडो तकनीकें
(30fps.net)- 3D गेम में शैडो वास्तविक दुनिया की तरह अपने-आप नहीं बनते, बल्कि सीमित performance के भीतर विश्वसनीय दिखने के लिए डिज़ाइन किए गए visual effect होते हैं
- शुरुआती 3D गेम शैडो के लिए 2D इमेज, पैरों के नीचे blob shadow, runtime शैडो texture, और plane-projected geometry जैसी सरल लेकिन तेज तकनीकों का उपयोग करते थे
- जैसे-जैसे scene अधिक जटिल हुए, projected texture, shadow map, और stencil shadow का उपयोग हुआ, लेकिन इनके साथ resolution artifacts, गलत surface projection, और अनुमान लगाना मुश्किल execution cost जैसी सीमाएँ भी आईं
- static level lighting में vertex color और lightmap से बड़े शैडो store किए जाते थे, और आधुनिक गेम भी Cascaded Shadow Maps, light probes, capsule shadows जैसी पारंपरिक तकनीकों के रूपांतरों का उपयोग करते रहते हैं
- ray tracing शैडो अधिक प्राकृतिक दिशा हैं, लेकिन Alan Wake 2 जैसे जटिल scenes में sampling और denoiser पर निर्भरता के कारण अब भी trade-off ही स्क्रीन के visual character को तय करते हैं
गेम के शैडो वास्तविक दुनिया से अलग बनाए जाते हैं
- वास्तविक दुनिया में शैडो रोशनी के रुकने का परिणाम होते हैं, और यदि एक ही light source बहुत दूर हो तो कई शैडो एक-दूसरे पर पड़ने पर भी और गहरे नहीं होते
- 3D वीडियोगेम में शैडो स्वाभाविक रूप से मौजूद नहीं होते, इसलिए developers को performance और visual believability के बीच सीधे डिज़ाइन करना पड़ता है
- Metal Gear Solid के blob shadow की तरह, गेम में ऐसा दिखाना भी संभव है कि शैडो एक-दूसरे पर चढ़ने पर और गहरे हो जाएँ
स्क्रीन पर सीधे बनाए जाने वाले 2D शैडो
- सबसे सरल तरीका यह है कि character को draw करने से पहले स्क्रीन पर 2D shadow image बना दी जाए
- Winter Gold और MDK ने scaling के बिना animated 2D shadow images का उपयोग किया
- जिन scenes में character बाकी सब चीज़ों से आगे होता है, वहाँ यह सरल तरीका भी अच्छी तरह काम करता है
Blob shadow: पैरों के नीचे का गहरा गोला
- 3D में सबसे सरल तरीका character के नीचे एक गहरा डिस्क draw करना है
- Super Mario 64 में character के लिए blob shadow का उपयोग किया गया, और Nintendo 64 के hardware decal feature से शैडो को प्रभावी रूप से clip करके सिर्फ floor plane पर दिखाया गया
- blob shadow को परिस्थिति के हिसाब से animate भी किया जा सकता है
- Super Mario 64 में jump करते समय शैडो छोटा हो जाता है
- Metal Gear Solid में शैडो का shape बदलता है
- शैडो के cliff से बाहर निकल जाने की समस्या को blob quad को decal की तरह project करके भी संभाला जा सकता है
Render texture आधारित planar shadow
- यदि blob सिर्फ एक साधारण texture है, तो runtime में character को ऊपर से render करके उसे shadow texture के रूप में उपयोग किया जा सकता है
- Crash Bandicoot: Warped ने runtime shadow texture से अच्छे नतीजे दिए
- Soldier of Fortune ने भी यही तरीका अपनाया, लेकिन कम shadow resolution के कारण नतीजे उतने अच्छे नहीं रहे
- यह तरीका light के viewpoint से depth map बनाने वाले shadow mapping से अलग है
- यहाँ black/white image को texture की तरह उपयोग किया जाता है
- यह 1-bit shadow map के काफ़ी करीब की अवधारणा है
Geometry से बनाए जाने वाले planar shadow
- सहज तरीका यह है कि शैडो डालने वाली object को light की उलटी दिशा में किसी plane पर चपटा project किया जाए, और उसी object को काले रंग में एक बार फिर render किया जाए
- ऐसे शैडो आमतौर पर opaque रखे जाते हैं ताकि object के हिस्सों के आपस में overlap होकर draw होने की समस्या छिप जाए
- सपाट floor पर यह अच्छा बैठता है, लेकिन जटिल terrain पर इसकी accuracy घट जाती है
- F-19 Stealth Fighter रनवे पर विमान का शैडो बनाता है
- GLQuake आधारित गेमों में भी planar shadow देखे जा सकते हैं
- Kingpin: Life of Crime ने काले planar shadow का ठीक-ठाक उपयोग किया
- Half-Life alpha 0.52 में transparency की समस्या दिखाई देती है
Terrain पर planar shadow
- David Braben का Virus spacecraft को terrain पर ऊपर से देखे गए शैडो डालने देता है
- Interstate ’76 ज़मीन की ढलान के हिसाब से planar shadow को tilt और stretch करता है
- कभी-कभी शैडो ज़मीन को भेदते हुए दिखाई देता है
- कुल मिलाकर यह काफ़ी विश्वसनीय लगता है
- software rendering स्क्रीन पर थोड़ा transparent शैडो दिखता है, जबकि hardware-accelerated स्क्रीन पर पूरी तरह काला शैडो दिखता है
- Interstate ’76 ने bridge जैसी बड़ी objects के शैडो project करने की भी कोशिश की, लेकिन नतीजे पूरी तरह सफल नहीं रहे
Projected texture drop shadow
- projected texture तरीका ऊपर बनाए गए shadow texture को plane पर नहीं, बल्कि विभिन्न प्रकार की surfaces पर project करता है
- अवधारणा के स्तर पर यह Bat-Signal को आसमान से नीचे चमकाने जैसा है
- Toy Story 3: The Video Game इस तरीके का एक उदाहरण है, और जब शैडो दूसरे शैडो पर चढ़ते हैं तो वे और गहरे हो जाते हैं
- यह बहुत sharp शैडो बना सकता है, लेकिन surface conditions के प्रति संवेदनशील है
- vertical surfaces पर यह अजीब लग सकता है
- कुछ मामलों में यह ceiling पर भी दिखाई दे सकता है
- Sonic Adventure 2: Battle के gameplay वीडियो में ऐसे उदाहरण देखे जा सकते हैं
- यह objects के आर-पार भी दिख सकता है, इसलिए विशेष मामलों में अधिक उपयुक्त है
- पेड़ों के शैडो के लिए भी यह अच्छा काम कर सकता है
Shadow map: व्यवहारिक रूप से मानक तरीका
- shadow map में गेम light के viewpoint से एक depth image बनाता है, और world को render करते समय उसी image को पढ़कर तय करता है कि शैडो कहाँ पड़ना चाहिए
- सामान्य rendering code को दोबारा उपयोग किया जा सकता है, इसलिए इसे लागू करना अपेक्षाकृत आसान है
- सीमित resolution से “Peter Panning” और “shadow acne” जैसे प्रसिद्ध artifacts पैदा होते हैं
- camera के पास की surfaces को shadow map का अधिक हिस्सा देने के लिए कई तकनीकें प्रस्तावित की गईं
- अच्छे दिखने वाले नतीजों के लिए आमतौर पर tuning करनी पड़ती है
Stencil shadow: तेज़ किनारे, लेकिन भारी लागत
- stencil shadow किसी भी surface पर sharp शैडो draw कर सकता है, और ऐसा film-noir look बनाता है जिसे shadow map से दोहराना मुश्किल है
- इसका प्रतिनिधि उदाहरण Doom 3 है, जो अपने अंधेरे कमरों के लिए प्रसिद्ध है
- इस तरीके में अदृश्य geometry यानी shadow volume से world को रोशनी वाले और शैडो वाले हिस्सों में बाँटा जाता है
- गेम सिर्फ उन pixels पर lighting लागू करता है जो shadow volume के भीतर नहीं होते
- इसे चलाने के लिए world को कई बार draw करना पड़ता है
- पहले पूरे world को ambient lighting के साथ draw किया जाता है
- फिर हर light के लिए shadow volume draw किया जाता है, और उसके बाद world को फिर से draw करके सिर्फ shadow के बाहर वाले pixels को प्रभावित किया जाता है
- front face और back face के लिए अलग-अलग stencil operation सेट किए जाते हैं
- संभवतः सबसे शुरुआती commercial उदाहरणों में Severance: Blade of Darkness शामिल है, जिसने 2001 में अच्छे शैडो दिखाए
- आज यह कम उपयोग होने का एक कारण execution cost का अनुमान लगाना कठिन होना है
- cost इस बात पर बहुत निर्भर करती है कि स्क्रीन पर shadow volume कितना बड़ा दिखता है
- optimized algorithms पर patent भी थे
- Doom 3 के बारे में ऐसे संबंधित links हैं जिनसे लगता है कि Id Software किसी तरह के समझौते पर पहुँचा था
Soft stencil shadow
- stencil shadow का sharp होना ज़रूरी नहीं है
- Silent Hill 2 ने PlayStation 2 पर stencil shadow draw करने के बाद blur लगाकर soft shadow बनाए
- console पर इसका परिणाम लगभग पूरी तरह परफ़ेक्ट दिखता है
Simplified character shadow
- स्क्रीन पर दिखने वाले model से सरल model को भी शैडो डालने के लिए इस्तेमाल किया जा सकता है
- Nintendo 64 के Zelda में सिर्फ Link के पैर शैडो डालते हैं, बाकी हिस्से नहीं
- Hyperblade ने futuristic hockey arena में खिलाड़ियों के लिए simple animated planar shadow का अनोखा उपयोग किया
Static level lighting में शैडो
- vertex color और lightmap गेम level की lighting store करने की तकनीकें हैं, और कई गेमों में बड़े पैमाने के शैडो दिखाने का यही एकमात्र तरीका था
-
Vertex color
- Ico दिखाता है कि पुरानी per-vertex lighting से भी परिष्कृत शैडो बनाए जा सकते हैं
- low-poly map में sharp शैडो भी vertex color से व्यक्त किए जा सकते हैं
- Tony Hawk Pro Skater 2 ने इस सरल तरीके से भी प्रभावशाली नतीजे दिए
-
Lightmap
- lightmap level lighting और शैडो store करने का क्लासिक तरीका है
- हर vertex में color store करने के बजाय, lighting के लिए दूसरा texture set उपयोग किया जाता है
- अलग-अलग areas को अलग resolution दिया जा सकता है, इसलिए जहाँ ज़रूरत हो वहाँ शैडो अधिक सटीक बनाए जा सकते हैं
- यह vertex color की तुलना में अधिक memory उपयोग करता है
- Quake को lightmap लोकप्रिय बनाने वाले गेम के रूप में गिना जाता है
आधुनिक गेमों में लगातार उपयोग होती पारंपरिक तकनीकें
- आधुनिक गेम भी परिस्थिति के हिसाब से पारंपरिक shadow techniques का उपयोग करते रहते हैं
- shadow mapping का एक रूप Cascaded Shadow Maps बड़े क्षेत्रों को तेज़ी से cover करने के लिए उपयोग होता है
- lightmap को light probes जैसी अन्य तकनीकों के साथ उपयोग किया जा सकता है
- Call of Duty भी lightmap का उपयोग करता है
- संबंधित उदाहरण Hemispherical Lighting Insights slides में हैं
- simplified character model का विचार भी जारी है
- The Last of Us खींचे हुए spheres से soft character shadow बनाता है
- Unreal Engine characters के लिए capsule shadows support करता है
- projected shadow भी अब तक उपयोग में हैं
- Hot Wheels Track Attack shadow mesh को texture में render करके उसे race track पर project करता है
- इसे developer blog के विवरण और gameplay वीडियो में देखा जा सकता है
Ray tracing शैडो भी परफ़ेक्ट नहीं हैं
- जो गेम physical accuracy वाली lighting simulate करना चाहते हैं, उनमें जहाँ रोशनी नहीं पहुँचती वहाँ शैडो स्वाभाविक रूप से बनते हैं
- shadow map के विपरीत, छोटे geometry details भी सटीक शैडो डाल सकते हैं
- बड़े lamp स्वाभाविक रूप से soft shadow बनाते हैं, और indirect light अंधेरे कोनों को उजला कर सकती है
- इस लक्ष्य को वास्तविक बनाने के लिए ray tracing algorithms और hardware पर बहुत समय और लागत लगाई गई है
- लेकिन आधुनिक गेम scenes इतने जटिल हैं कि simulation को approximate करना पड़ता है
- Alan Wake 2 के ray-traced shadows में हर pixel को यादृच्छिक रूप से चुनी गई एक light से ही रोशनी मिलती है
- परिणाम को denoiser में भेजा जाता है, जो noisy image को बुद्धिमानी से smooth करता है
- ray tracing शैडो भी परफ़ेक्ट नहीं हैं, और चुने गए trade-off के अनुसार उनका अपना अलग look बनता है
बिना शैडो वाला विकल्प
- कुछ गेम शैडो की बजाय अन्य तत्वों को अधिक प्राथमिकता दे सकते हैं
- शैडो लागू न करना भी एक स्पष्ट डिज़ाइन विकल्प हो सकता है
1 टिप्पणियां
Hacker News की राय
यह कोई optical illusion या artistic mood नहीं है, बल्कि साफ़ नीले आसमान वाले दिन परछाइयाँ आसमान से परावर्तित रोशनी से प्रकाशित होती हैं, इसलिए वे नीली दिखती हैं
कार के नीचे देखें तो जहाँ आसमान दिखता है वहाँ साफ़ नीली परछाइयाँ दिखेंगी, और जहाँ कार का बॉडी आसमानी रोशनी तक रोक देता है वहाँ वे असली काले के ज़्यादा करीब हो जाती हैं
इस साफ़ नीली धूप वाली परछाईं में मुलायम और काली AO sky shadow मिला दें, तो कम लागत में काफ़ी सुंदर परछाइयाँ बनाई जा सकती हैं
कोई अच्छा graphics rendering engine ऐसा करता है। परछाइयों में आसमानी रंग की हल्की tint होनी चाहिए
इसी वजह से पुरानी No Man's Sky screenshots में कुछ मुझे खटकती थीं। शायद मैंने ऐसे scenes देखे थे जहाँ आसमान हरा था लेकिन परछाइयाँ बैंगनी थीं
इससे पुराने blob shadow की तरह jump के बाद कहाँ land करेंगे, यह समझने में मदद मिलती है, और साथ ही proper shadow की visual quality भी बनी रहती है
अगर मुझे सही याद है, तो अंधेरे environments में वे परछाईं को ज़मीन से ज़्यादा चमकीला भी बना देते हैं ताकि वह दिखाई देती रहे
तब player model के load और unload होने पर परछाइयाँ आती-जाती रहेंगी, इसलिए जब तक player का शरीर न दिखे, परछाईं भी नहीं दिख सकती
Valorant को low-end hardware पर भी बहुत high frame rates देने के लिए जानबूझकर rendering को बेहद simple रखा गया था। न केवल dynamic shadows नहीं हैं, बल्कि dynamic lighting भी बिल्कुल नहीं है, और कहीं भी alpha transparency नहीं है
आम तौर पर पारदर्शी बनाए जाने वाले smoke effects जैसी चीज़ों को भी पूरी तरह opaque style में रखा गया, क्योंकि वह तेज़ है। cheating से अलग भी, performance की वजह से dynamic shadows शायद वैसे भी हटा दी जातीं
Ray tracing techniques अपनाए जाने के साथ area lights और soft shadows standard बन जाएँगे, ऐसा लगता है। अगर hardware साथ देता हो, तो Quake 2 RTX देखकर अंदाज़ा लगाया जा सकता है कि भविष्य कैसा दिखेगा
आखिर में, मैंने इस blog को अपनी graphics materials list में जोड़ लिया: https://github.com/aaron9000/c-game-resources
https://www.youtube.com/watch?v=7BvtML5dIuI
PowerVR PCX1 में shadow volumes के लिए hardware support था, और यह standard stencil shadows से अधिक efficient तरीके से implement किया गया था। scene को कई बार draw करने के बजाय, hardware मूलतः on-chip depth/stencil buffer में depth-only pre-pass चलाकर visible pixels तय करता था, फिर shadow volume test करके देखता था कि कौन से pixels shadow के भीतर हैं, और उसके बाद texture sampling तथा shading करता था
रोशनी की brightness shadow volume के परिणाम के अनुसार adjust होती थी, और क्योंकि केवल visible pixels की shading होती थी, overdraw अनावश्यक texture fetch bandwidth बर्बाद नहीं करता था
PCX1 के successor-based Dreamcast में भी shadow volumes इस्तेमाल करने वाले बहुत से games थे। Dreamcast implementation और भी flexible था, इसलिए volumes केवल lighting ही नहीं बल्कि कौन-सा texture, UV mapping, यहाँ तक कि transparent polygons के blending equation तक बदल सकते थे
मैंने DC पर soft shadows भी बनाई थीं (https://imgur.com/a/DyaqzZD का आख़िरी हिस्सा), लेकिन फिर ज़्यादा standard stencil method पर लौट आया, जिसमें shadows को कई बार redraw करना पड़ता है, इसलिए fillrate पर काफ़ी बोझ पड़ता है
अगर दो lamps तीन लोगों पर रोशनी डाल रहे हों, तो छह shadows बनेंगी। जहाँ ये छहों shadows overlap करेंगी, वह “काला” हो जाएगा या केवल ambient light पाएगा
जहाँ shadows कम overlap करेंगी, वहाँ illumination gradient बनेगा
अगर आप light source A की shadow के भीतर हैं और light source B की shadow के भीतर भी, तो रोशनी कहाँ से मिलेगी? सिर्फ ambient से, और वह भी न हो तो काला
इसमें यह शर्त लगी हुई है कि “केवल एक light source है और वह काफ़ी दूर है, इसलिए shadow बस रोशनी की अनुपस्थिति है”
वह shadow इस game में जबरदस्त speed का एहसास देने वाला एक और छोटा-सा तत्व थी
https://imgur.com/a/hOgxr7a
https://www.mobygames.com/game/6233/f29-retaliator/
जो पल अब भी याद है, वह रात में एक पिछली गली में कार चोरी करते समय का है। ठीक उसी क्षण जब player character कार में घुसा, पुलिस मोड़ से निकलकर आ गई, उसने कार चोरी होते “देखी” और बंदूक निकाली, और उसी समय headlights जल उठीं, जिससे चलते हुए पुलिसकर्मी की विशाल shadow पास की दीवार पर पड़ी
MGS में shadow overlap पूरी तरह ग़लत नहीं है। इसकी वजह ambient light, scattering, और दूसरी global illumination घटनाएँ हैं
“Mirror’s Edge(2008, PC) मूलतः Lightmaps: The Game है” यह बात मज़ेदार भी है और सही भी। वह game तब भी प्रभावशाली था और आज भी है
मेरे हिसाब से उस समय उसे अनुचित रूप से कम आंका गया। शायद इसलिए कि वह अपने competitors से छोटा था