WebGL-இல் நிகழ்நேர நிழல் ரெண்டரிங்கின் அடிப்படைகள் மற்றும் மேம்பட்ட நுட்பங்களைக் கற்றுக்கொள்ளுங்கள். இந்த வழிகாட்டி நிழல் மேப்பிங், PCF, CSM மற்றும் பொதுவான சிக்கல்களுக்கான தீர்வுகளை உள்ளடக்கியது.
WebGL நிழல் மேப்பிங்: நிகழ்நேர ரெண்டரிங்கிற்கான ஒரு விரிவான வழிகாட்டி
3D கணினி வரைகலை உலகில், நிழல்களை விட யதார்த்தத்திற்கும் ஈடுபாட்டிற்கும் பங்களிக்கும் கூறுகள் சிலவே. அவை பொருட்களுக்கு இடையேயான இடஞ்சார்ந்த உறவுகள், ஒளி மூலங்களின் இருப்பிடம் மற்றும் ஒரு காட்சியின் ஒட்டுமொத்த வடிவியல் பற்றிய முக்கியமான காட்சி குறிப்புகளை வழங்குகின்றன. நிழல்கள் இல்லாமல், 3D உலகங்கள் தட்டையாகவும், தொடர்பற்றதாகவும், செயற்கையாகவும் உணரப்படலாம். WebGL மூலம் இயக்கப்படும் வலை அடிப்படையிலான 3D பயன்பாடுகளுக்கு, உயர்தர, நிகழ்நேர நிழல்களை செயல்படுத்துவது தொழில்முறை தர அனுபவங்களின் ஒரு அடையாளமாகும். இதை அடைவதற்கான மிக அடிப்படையான மற்றும் பரவலாகப் பயன்படுத்தப்படும் நுட்பமான நிழல் மேப்பிங் (Shadow Mapping) பற்றி இந்த வழிகாட்டி ஆழமாக விவரிக்கிறது.
நீங்கள் ஒரு அனுபவமிக்க கிராபிக்ஸ் புரோகிராமராக இருந்தாலும் சரி அல்லது மூன்றாவது பரிமாணத்திற்குள் நுழையும் ஒரு வலை உருவாக்குநராக இருந்தாலும் சரி, இந்த கட்டுரை உங்கள் WebGL திட்டங்களில் நிகழ்நேர நிழல்களைப் புரிந்துகொள்ளவும், செயல்படுத்தவும் மற்றும் சரிசெய்யவும் தேவையான அறிவை உங்களுக்கு வழங்கும். நாம் முக்கிய கோட்பாட்டிலிருந்து நடைமுறை செயல்படுத்தல் விவரங்கள் வரை பயணித்து, பொதுவான ஆபத்துகள் மற்றும் நவீன கிராபிக்ஸ் என்ஜின்களில் பயன்படுத்தப்படும் மேம்பட்ட நுட்பங்களை ஆராய்வோம்.
அத்தியாயம் 1: நிழல் மேப்பிங்கின் அடிப்படைகள்
அதன் மையத்தில், நிழல் மேப்பிங் என்பது ஒரு புத்திசாலித்தனமான மற்றும் நேர்த்தியான நுட்பமாகும், இது ஒரு காட்சியில் உள்ள ஒரு புள்ளி நிழலில் உள்ளதா என்பதை ஒரு எளிய கேள்வியைக் கேட்பதன் மூலம் தீர்மானிக்கிறது: "இந்த புள்ளியை ஒளி மூலத்தால் பார்க்க முடியுமா?" பதில் இல்லை என்றால், ஏதோ ஒன்று ஒளியைத் தடுக்கிறது என்று அர்த்தம், மேலும் அந்த புள்ளி நிழலில் இருக்க வேண்டும். இந்த கேள்விக்கு நிரல்ரீதியாக பதிலளிக்க, நாம் இரண்டு-பாஸ் ரெண்டரிங் அணுகுமுறையைப் பயன்படுத்துகிறோம்.
நிழல் மேப்பிங் என்றால் என்ன? முக்கிய கருத்து
முழு நுட்பமும் காட்சியை இரண்டு முறை, ஒவ்வொரு முறையும் வெவ்வேறு கோணத்தில் இருந்து ரெண்டரிங் செய்வதை சுற்றியே உள்ளது:
- பாஸ் 1: ஆழப் பாஸ் (ஒளியின் பார்வை). முதலில், நாம் முழு காட்சியையும் ஒளி மூலத்தின் சரியான நிலை மற்றும் திசையிலிருந்து ரெண்டர் செய்கிறோம். இருப்பினும், இந்த பாஸில் வண்ணங்கள் அல்லது டெக்ஸ்சர்கள் பற்றி நாம் கவலைப்படுவதில்லை. நமக்குத் தேவையான ஒரே தகவல் ஆழம் மட்டுமே. ரெண்டர் செய்யப்படும் ஒவ்வொரு பொருளுக்கும், ஒளி மூலத்திலிருந்து அதன் தூரத்தை நாம் பதிவு செய்கிறோம். இந்த ஆழ மதிப்புகளின் தொகுப்பு ஒரு சிறப்பு டெக்ஸ்சரில் நிழல் வரைபடம் அல்லது ஆழ வரைபடம் என்று அழைக்கப்படுகிறது. இந்த வரைபடத்தில் உள்ள ஒவ்வொரு பிக்சலும், ஒளியின் பார்வையில் இருந்து ஒரு குறிப்பிட்ட திசையில் உள்ள மிக நெருக்கமான பொருளுக்கான தூரத்தைக் குறிக்கிறது.
- பாஸ் 2: காட்சிப் பாஸ் (கேமராவின் பார்வை). அடுத்து, நாம் வழக்கமாகச் செய்வது போல, பிரதான கேமராவின் பார்வையில் இருந்து காட்சியை ரெண்டர் செய்கிறோம். ஆனால் வரையப்படும் ஒவ்வொரு பிக்சலுக்கும், நாம் ஒரு கூடுதல் கணக்கீட்டைச் செய்கிறோம். நாம் அந்த பிக்சலின் நிலையை 3D வெளியில் தீர்மானித்து, பின்னர் கேட்கிறோம்: "இந்த புள்ளி ஒளி மூலத்திலிருந்து எவ்வளவு தூரத்தில் உள்ளது?" பின்னர் இந்த தூரத்தை நமது நிழல் வரைபடத்தில் (பாஸ் 1 இலிருந்து) அதனுடன் தொடர்புடைய இடத்தில் சேமிக்கப்பட்ட மதிப்புடன் ஒப்பிடுகிறோம்.
அதன் தர்க்கம் எளிமையானது:
- பிக்சலின் தற்போதைய தூரம் ஒளி மூலத்திலிருந்து நிழல் வரைபடத்தில் சேமிக்கப்பட்ட தூரத்தை விட அதிகமாக இருந்தால், அதே பார்வைக்கோட்டில் ஒளிக்கு நெருக்கமாக மற்றொரு பொருள் உள்ளது என்று அர்த்தம். எனவே, தற்போதைய பிக்சல் நிழலில் உள்ளது.
- பிக்சலின் தூரம் நிழல் வரைபடத்தில் உள்ள தூரத்தை விட குறைவாகவோ அல்லது சமமாகவோ இருந்தால், எதுவும் அதைத் தடுக்கவில்லை என்று அர்த்தம், மேலும் பிக்சல் முழுமையாக ஒளிரூட்டப்பட்டுள்ளது.
காட்சியை அமைத்தல்
WebGL இல் நிழல் மேப்பிங்கை செயல்படுத்த, உங்களுக்கு பல முக்கிய கூறுகள் தேவை:
- ஒரு ஒளி மூலம்: இது ஒரு திசை ஒளி (சூரியனைப் போல), ஒரு புள்ளி ஒளி (விளக்கைப் போல), அல்லது ஒரு ஸ்பாட்லைட்டாக இருக்கலாம். ஒளியின் வகை, ஆழப் பாஸின் போது பயன்படுத்தப்படும் ப்ரொஜெக்ஷன் மேட்ரிக்ஸ் வகையை தீர்மானிக்கும்.
- ஒரு ஃபிரேம் பஃபர் பொருள் (FBO): WebGL பொதுவாக திரையின் இயல்புநிலை ஃபிரேம் பஃபருக்கு ரெண்டர் செய்கிறது. நமது நிழல் வரைபடத்தை உருவாக்க, நமக்கு ஒரு ஆஃப்-ஸ்கிரீன் ரெண்டர் இலக்கு தேவை. ஒரு FBO, திரைக்கு பதிலாக ஒரு டெக்ஸ்சருக்குள் ரெண்டர் செய்ய நம்மை அனுமதிக்கிறது. நமது FBO ஒரு ஆழ டெக்ஸ்சர் இணைப்புடன் கட்டமைக்கப்படும்.
- இரண்டு செட் ஷேடர்கள்: உங்களுக்கு ஆழப் பாஸிற்காக ஒரு ஷேடர் புரோகிராமும் (மிகவும் எளிமையானது) மற்றும் இறுதி காட்சிப் பாஸிற்காக மற்றொன்றும் (நிழல் கணக்கீட்டு தர்க்கத்தைக் கொண்டிருக்கும்) தேவைப்படும்.
- மேட்ரிக்ஸ்கள்: உங்களுக்கு கேமராவிற்கான நிலையான மாடல், வியூ மற்றும் ப்ரொஜெக்ஷன் மேட்ரிக்ஸ்கள் தேவைப்படும். முக்கியமாக, உங்களுக்கு ஒளி மூலத்திற்கான ஒரு வியூ மற்றும் ப்ரொஜெக்ஷன் மேட்ரிக்ஸும் தேவைப்படும், இது பெரும்பாலும் ஒரே "லைட் ஸ்பேஸ் மேட்ரிக்ஸ்" ஆக இணைக்கப்படுகிறது.
அத்தியாயம் 2: இரண்டு-பாஸ் ரெண்டரிங் பைப்லைன் விரிவாக
இரண்டு ரெண்டரிங் பாஸ்களையும் படிப்படியாகப் பிரிப்போம், மேட்ரிக்ஸ்கள் மற்றும் ஷேடர்களின் பங்குகளில் கவனம் செலுத்துவோம்.
பாஸ் 1: ஆழப் பாஸ் (ஒளியின் பார்வையில் இருந்து)
இந்த பாஸின் குறிக்கோள் நமது ஆழ டெக்ஸ்சரை நிரப்புவது. அது எப்படி செயல்படுகிறது என்பது இங்கே:
- FBO-ஐ பைண்ட் செய்யவும்: வரைவதற்கு முன், உங்கள் கேன்வாஸிற்கு பதிலாக உங்கள் தனிப்பயன் FBO-க்கு ரெண்டர் செய்யுமாறு WebGL-க்கு அறிவுறுத்துங்கள்.
- வியூபோர்ட்டை உள்ளமைக்கவும்: உங்கள் நிழல் வரைபட டெக்ஸ்சரின் அளவிற்கு (எ.கா., 1024x1024 பிக்சல்கள்) பொருந்தும்படி வியூபோர்ட் பரிமாணங்களை அமைக்கவும்.
- ஆழ பஃபரை அழிக்கவும்: ரெண்டரிங் செய்வதற்கு முன் FBO-இன் ஆழ பஃபர் அழிக்கப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்.
- ஒளியின் மேட்ரிக்ஸ்களை உருவாக்கவும்:
- லைட் வியூ மேட்ரிக்ஸ்: இந்த மேட்ரிக்ஸ் உலகை ஒளியின் பார்வைக் கோணத்திற்கு மாற்றுகிறது. ஒரு திசை ஒளிக்கு, இது பொதுவாக ஒரு `lookAt` செயல்பாட்டின் மூலம் உருவாக்கப்படுகிறது, இதில் "கண்" என்பது ஒளியின் நிலை மற்றும் "இலக்கு" என்பது அது சுட்டிக்காட்டும் திசையாகும்.
- லைட் ப்ரொஜெக்ஷன் மேட்ரிக்ஸ்: இணையான கதிர்களைக் கொண்ட ஒரு திசை ஒளிக்கு, ஒரு ஆர்த்தோகிராஃபிக் ப்ரொஜெக்ஷன் பயன்படுத்தப்படுகிறது. புள்ளி விளக்குகள் அல்லது ஸ்பாட்லைட்களுக்கு, ஒரு பெர்ஸ்பெக்டிவ் ப்ரொஜெக்ஷன் பயன்படுத்தப்படுகிறது. இந்த மேட்ரிக்ஸ், நிழல்களை உருவாக்கும் விண்வெளியில் உள்ள கன அளவை (ஒரு பெட்டி அல்லது ஒரு ஃபிரஸ்டம்) வரையறுக்கிறது.
- டெப்த் ஷேடர் புரோகிராமைப் பயன்படுத்தவும்: இது ஒரு மிகக்குறைந்த ஷேடர். வெர்டெக்ஸ் ஷேடரின் ஒரே வேலை, வெர்டெக்ஸ் நிலையை ஒளியின் வியூ மற்றும் ப்ரொஜெக்ஷன் மேட்ரிக்ஸ்களால் பெருக்குவதாகும். ஃபிராக்மென்ட் ஷேடர் இன்னும் எளிமையானது: இது ஃபிராக்மென்டின் ஆழ மதிப்பை (அதன் z-கோஆர்டினேட்) ஆழ டெக்ஸ்சரில் எழுதுகிறது. நவீன WebGL-இல், உங்களுக்கு பெரும்பாலும் ஒரு தனிப்பயன் ஃபிராக்மென்ட் ஷேடர் கூட தேவையில்லை, ஏனெனில் FBO ஆனது ஆழ பஃபரை தானாகவே கைப்பற்றும் வகையில் கட்டமைக்கப்படலாம்.
- காட்சியை ரெண்டர் செய்யவும்: உங்கள் காட்சியில் நிழல்களை உருவாக்கும் அனைத்து பொருட்களையும் வரையவும். FBO இப்போது நமது முடிக்கப்பட்ட நிழல் வரைபடத்தைக் கொண்டுள்ளது.
பாஸ் 2: காட்சிப் பாஸ் (கேமராவின் பார்வையில் இருந்து)
இப்போது நாம் இறுதிப் படத்தை ரெண்டர் செய்கிறோம், நிழல்களைத் தீர்மானிக்க நாம் இப்போது உருவாக்கிய நிழல் வரைபடத்தைப் பயன்படுத்துகிறோம்.
- FBO-ஐ அன்பைண்ட் செய்யவும்: இயல்புநிலை கேன்வாஸ் ஃபிரேம் பஃபருக்கு ரெண்டரிங் செய்ய மீண்டும் மாறவும்.
- வியூபோர்ட்டை உள்ளமைக்கவும்: வியூபோர்ட்டை மீண்டும் கேன்வாஸ் பரிமாணங்களுக்கு அமைக்கவும்.
- திரையை அழிக்கவும்: கேன்வாஸின் நிறம் மற்றும் ஆழ பஃபர்களை அழிக்கவும்.
- சீன் ஷேடர் புரோகிராமைப் பயன்படுத்தவும்: இங்குதான் மாயாஜாலம் நிகழ்கிறது. இந்த ஷேடர் மிகவும் சிக்கலானது.
- வெர்டெக்ஸ் ஷேடர்: இந்த ஷேடர் இரண்டு விஷயங்களைச் செய்ய வேண்டும். முதலில், இது வழக்கம்போல் கேமராவின் மாடல், வியூ மற்றும் ப்ரொஜெக்ஷன் மேட்ரிக்ஸ்களைப் பயன்படுத்தி இறுதி வெர்டெக்ஸ் நிலையை கணக்கிடுகிறது. இரண்டாவதாக, இது பாஸ் 1 இலிருந்து லைட் ஸ்பேஸ் மேட்ரிக்ஸைப் பயன்படுத்தி ஒளியின் பார்வையில் இருந்து வெர்டெக்ஸின் நிலையையும் கணக்கிட வேண்டும். இந்த இரண்டாவது கோஆர்டினேட் ஃபிராக்மென்ட் ஷேடருக்கு ஒரு வேரியிங் ஆக அனுப்பப்படுகிறது.
- ஃபிராக்மென்ட் ஷேடர்: இது நிழல் தர்க்கத்தின் மையமாகும். ஒவ்வொரு ஃபிராக்மென்ட்டிற்கும்:
- வெர்டெக்ஸ் ஷேடரிலிருந்து லைட் ஸ்பேஸில் உள்ள இன்டர்போலேட் செய்யப்பட்ட நிலையைப் பெறவும்.
- இந்த கோஆர்டினேட்டில் ஒரு பெர்ஸ்பெக்டிவ் டிவைட் செய்யவும் (x, y, z ஐ w ஆல் வகுக்கவும்). இது அதை நார்மலைஸ்டு டிவைஸ் கோஆர்டினேட்ஸ் (NDC) ஆக மாற்றுகிறது, இது -1 முதல் 1 வரை இருக்கும்.
- NDC-ஐ டெக்ஸ்சர் கோஆர்டினேட்டுகளாக மாற்றவும் (இது 0 முதல் 1 வரை இருக்கும்), இதன் மூலம் நமது நிழல் வரைபடத்தை மாதிரியாக எடுக்க முடியும். இது ஒரு எளிய ஸ்கேல் மற்றும் பயாஸ் செயல்பாடு: `texCoord = ndc * 0.5 + 0.5;`.
- பாஸ் 1 இல் உருவாக்கப்பட்ட நிழல் வரைபட டெக்ஸ்சரை மாதிரியாக எடுக்க இந்த டெக்ஸ்சர் கோஆர்டினேட்டுகளைப் பயன்படுத்தவும். இது நமக்கு `depthFromShadowMap` ஐத் தருகிறது.
- ஒளியின் பார்வையில் இருந்து ஃபிராக்மென்டின் தற்போதைய ஆழம், மாற்றப்பட்ட லைட் ஸ்பேஸ் கோஆர்டினேட்டிலிருந்து அதன் z-கூறு ஆகும். அதை `currentDepth` என்று அழைப்போம்.
- ஆழங்களை ஒப்பிடவும்: `currentDepth > depthFromShadowMap` என்றால், ஃபிராக்மென்ட் நிழலில் உள்ளது. "நிழல் முகப்பரு" எனப்படும் ஒரு பிழையைத் தவிர்க்க இந்த சோதனைக்கு ஒரு சிறிய பயாஸை சேர்க்க வேண்டும், அதை அடுத்து விவாதிப்போம்.
- ஒப்பீட்டின் அடிப்படையில், ஒரு நிழல் காரணியைத் தீர்மானிக்கவும் (எ.கா., ஒளியூட்டப்பட்டதற்கு 1.0, நிழலாக்கப்பட்டதற்கு 0.3).
- இந்த நிழல் காரணியை இறுதி வண்ணக் கணக்கீட்டில் பயன்படுத்தவும் (எ.கா., சுற்றுப்புற மற்றும் பரவல் ஒளி கூறுகளை நிழல் காரணியால் பெருக்கவும்).
- காட்சியை ரெண்டர் செய்யவும்: காட்சியில் உள்ள அனைத்து பொருட்களையும் வரையவும்.
அத்தியாயம் 3: பொதுவான பிரச்சனைகளும் தீர்வுகளும்
அடிப்படை நிழல் மேப்பிங்கை செயல்படுத்துவது பல பொதுவான காட்சிப் பிழைகளை விரைவாக வெளிப்படுத்தும். உயர்தர முடிவுகளை அடைய அவற்றை புரிந்துகொண்டு சரிசெய்வது முக்கியம்.
நிழல் முகப்பரு (சுய-நிழல் பிழைகள்)
பிரச்சனை: முழுமையாக ஒளிரூட்டப்பட வேண்டிய பரப்புகளில் விசித்திரமான, தவறான இருண்ட கோடுகள் அல்லது மோயர் போன்ற வடிவங்களைக் காணலாம். இது "நிழல் முகப்பரு" என்று அழைக்கப்படுகிறது. நிழல் வரைபடத்தில் சேமிக்கப்பட்ட ஆழ மதிப்பும், காட்சிப் பாஸின் போது கணக்கிடப்பட்ட ஆழ மதிப்பும் ஒரே மேற்பரப்பிற்கானது என்பதால் இது ஏற்படுகிறது. மிதவைப் புள்ளித் துல்லியமின்மைகள் மற்றும் நிழல் வரைபடத்தின் வரையறுக்கப்பட்ட தெளிவுத்திறன் காரணமாக, சிறிய பிழைகள் ஒரு ஃபிராக்மென்ட் தன்னைத் தானே பின்னால் இருப்பதாக தவறாகத் தீர்மானிக்க காரணமாகலாம், இதன் விளைவாக சுய-நிழல் ஏற்படுகிறது.
தீர்வு: டெப்த் பயாஸ். எளிமையான தீர்வு, ஒப்பீட்டிற்கு முன் `currentDepth` க்கு ஒரு சிறிய பயாஸை அறிமுகப்படுத்துவதாகும். ஃபிராக்மென்டை அது உண்மையில் இருப்பதை விட ஒளிக்கு சற்று நெருக்கமாகத் தோற்றமளிக்கச் செய்வதன் மூலம், நாம் அதை அதன் சொந்த நிழலில் இருந்து "வெளியே" தள்ளுகிறோம்.
float shadow = currentDepth > depthFromShadowMap + bias ? 0.3 : 1.0;
சரியான பயாஸ் மதிப்பைக் கண்டறிவது ஒரு நுட்பமான சமநிலைப்படுத்தும் செயலாகும். மிகவும் சிறியதாக இருந்தால், முகப்பரு நீடிக்கும். மிகவும் பெரியதாக இருந்தால், அடுத்த சிக்கலைப் பெறுவீர்கள்.
பீட்டர் பேனிங்
பிரச்சனை: பறக்கக்கூடிய மற்றும் தனது நிழலை இழந்த கதாபாத்திரத்தின் பெயரிடப்பட்ட இந்த பிழை, ஒரு பொருளுக்கும் அதன் நிழலுக்கும் இடையில் ஒரு புலப்படும் இடைவெளியாக வெளிப்படுகிறது. இது பொருட்களை மிதப்பதாகவோ அல்லது அவை இருக்க வேண்டிய பரப்புகளில் இருந்து துண்டிக்கப்பட்டதாகவோ தோற்றமளிக்கச் செய்கிறது. இது மிகவும் பெரிய டெப்த் பயாஸைப் பயன்படுத்துவதன் நேரடி விளைவாகும்.
தீர்வு: ஸ்லோப்-ஸ்கேல் டெப்த் பயாஸ். ஒரு நிலையான பயாஸை விட மிகவும் வலுவான தீர்வு, பயாஸை ஒளிக்கு சார்பாக மேற்பரப்பின் செங்குத்தான தன்மையைப் பொறுத்து மாற்றுவதாகும். செங்குத்தான பலகோணங்கள் முகப்பருவுக்கு அதிக வாய்ப்புள்ளது மற்றும் ஒரு பெரிய பயாஸ் தேவைப்படுகிறது. தட்டையான பலகோணங்களுக்கு ஒரு சிறிய பயாஸ் தேவை. WebGL உட்பட பெரும்பாலான கிராபிக்ஸ் APIகள், ஆழப் பாஸின் போது இந்த வகையான பயாஸை தானாகவே பயன்படுத்தும் செயல்பாட்டை வழங்குகின்றன, இது பொதுவாக ஃபிராக்மென்ட் ஷேடரில் ஒரு கையேடு பயாஸை விட விரும்பத்தக்கது.
பெர்ஸ்பெக்டிவ் அலியாசிங் (கரடுமுரடான விளிம்புகள்)
பிரச்சனை: உங்கள் நிழல்களின் விளிம்புகள் கட்டம் கட்டமாகவும், கரடுமுரடாகவும், பிக்சலேட்டடாகவும் தெரிகின்றன. இது அலியாசிங்கின் ஒரு வடிவம். நிழல் வரைபடத்தின் தெளிவுத்திறன் வரையறுக்கப்பட்டதாக இருப்பதால் இது நிகழ்கிறது. நிழல் வரைபடத்தில் உள்ள ஒரு பிக்சல் (அல்லது டெக்சல்) இறுதிக் காட்சியில் ஒரு மேற்பரப்பில் ஒரு பெரிய பகுதியை உள்ளடக்கக்கூடும், குறிப்பாக கேமராவிற்கு அருகிலுள்ள பரப்புகள் அல்லது ஒரு மேலோட்டமான கோணத்தில் பார்க்கப்படும் பரப்புகளுக்கு. தெளிவுத்திறனில் உள்ள இந்த பொருந்தாமை சிறப்பியல்பு கட்டம் போன்ற தோற்றத்தை ஏற்படுத்துகிறது.
தீர்வு: நிழல் வரைபடத்தின் தெளிவுத்திறனை அதிகரிப்பது (எ.கா., 1024x1024 இலிருந்து 4096x4096 க்கு) உதவக்கூடும், ஆனால் இது குறிப்பிடத்தக்க நினைவகம் மற்றும் செயல்திறன் செலவில் வருகிறது மற்றும் அடிப்படை சிக்கலை முழுமையாக தீர்க்காது. உண்மையான தீர்வுகள் மேலும் மேம்பட்ட நுட்பங்களில் உள்ளன.
அத்தியாயம் 4: மேம்பட்ட நிழல் மேப்பிங் நுட்பங்கள்
அடிப்படை நிழல் மேப்பிங் ஒரு அடித்தளத்தை வழங்குகிறது, ஆனால் தொழில்முறை பயன்பாடுகள் அதன் வரம்புகளை, குறிப்பாக அலியாசிங்கை சமாளிக்க மேலும் நுட்பமான வழிமுறைகளைப் பயன்படுத்துகின்றன.
சதவீத-நெருக்க வடிகட்டுதல் (PCF)
நிழல் விளிம்புகளை மென்மையாக்கவும், அலியாசிங்கைக் குறைக்கவும் PCF மிகவும் பொதுவான நுட்பமாகும். நிழல் வரைபடத்திலிருந்து ஒரே ஒரு மாதிரியை எடுத்து பைனரி (நிழலில் அல்லது நிழலில் இல்லை) முடிவை எடுப்பதற்குப் பதிலாக, PCF இலக்கு கோஆர்டினேட்டைச் சுற்றியுள்ள பகுதியிலிருந்து பல மாதிரிகளை எடுக்கிறது.
கருத்து: ஒவ்வொரு ஃபிராக்மென்ட்டிற்கும், நாம் நிழல் வரைபடத்தை ஒரு முறை மட்டுமல்ல, ஃபிராக்மென்டின் ப்ரொஜெக்டட் டெக்ஸ்சர் கோஆர்டினேட்டைச் சுற்றி ஒரு கட்டம் வடிவத்தில் (எ.கா., 3x3 அல்லது 5x5) மாதிரியாக எடுக்கிறோம். இந்த மாதிரிகள் ஒவ்வொன்றிற்கும், நாம் ஆழ ஒப்பீட்டைச் செய்கிறோம். இறுதி நிழல் மதிப்பு இந்த ஒப்பீடுகள் அனைத்தின் சராசரி ஆகும். உதாரணமாக, 9 மாதிரிகளில் 4 நிழலில் இருந்தால், ஃபிராக்மென்ட் 4/9 பங்கு நிழலாக்கப்படும், இதன் விளைவாக ஒரு மென்மையான பெனும்ப்ரா (நிழலின் மென்மையான விளிம்பு) உருவாகும்.
செயல்படுத்தல்: இது முற்றிலும் ஃபிராக்மென்ட் ஷேடருக்குள் செய்யப்படுகிறது. இது ஒரு சிறிய கெர்னலைச் சுற்றி ஒரு லூப்பை உள்ளடக்கியது, ஒவ்வொரு ஆஃப்செட்டிலும் நிழல் வரைபடத்தை மாதிரியாக எடுத்து முடிவுகளைக் குவிக்கிறது. WebGL 2 வன்பொருள் ஆதரவை (`texture` உடன் `sampler2DShadow`) வழங்குகிறது, இது ஒப்பீடு மற்றும் வடிகட்டலை மிகவும் திறமையாகச் செய்ய முடியும்.
பயன்: கடினமான, அலியாஸ்டு விளிம்புகளை மென்மையான, மெல்லிய விளிம்புகளுடன் மாற்றுவதன் மூலம் நிழலின் தரத்தை வியத்தகு முறையில் மேம்படுத்துகிறது.
செலவு: ஒரு ஃபிராக்மென்ட்டிற்கு எடுக்கப்படும் மாதிரிகளின் எண்ணிக்கையுடன் செயல்திறன் குறைகிறது.
அடுக்கு நிழல் வரைபடங்கள் (CSM)
CSM என்பது ஒரு பெரிய காட்சியில் ஒரே திசை ஒளி மூலத்திலிருந்து (சூரியனைப் போல) நிழல்களை ரெண்டர் செய்வதற்கான தொழில்துறை-தர தீர்வு. இது பெர்ஸ்பெக்டிவ் அலியாசிங் சிக்கலை நேரடியாகக் கையாள்கிறது.
கருத்து: மைய யோசனை என்னவென்றால், கேமராவிற்கு அருகிலுள்ள பொருட்களுக்கு தொலைவில் உள்ள பொருட்களை விட அதிக நிழல் தெளிவுத்திறன் தேவைப்படுகிறது. CSM கேமராவின் வியூ ஃபிரஸ்டத்தை அதன் ஆழம் வழியாக பல பிரிவுகளாக அல்லது "அடுக்குகளாக" பிரிக்கிறது. ஒவ்வொரு அடுக்குக்கும் ஒரு தனி, உயர்தர நிழல் வரைபடம் ரெண்டர் செய்யப்படுகிறது. கேமராவிற்கு மிக நெருக்கமான அடுக்கு உலக வெளியில் ஒரு சிறிய பகுதியை உள்ளடக்கியது, இதனால் மிக அதிக பயனுள்ள தெளிவுத்திறனைக் கொண்டுள்ளது. தொலைவில் உள்ள அடுக்குகள் அதே டெக்ஸ்சர் அளவுடன் படிப்படியாக பெரிய பகுதிகளை உள்ளடக்குகின்றன, இது ஏற்றுக்கொள்ளத்தக்கது, ஏனெனில் அந்த விவரங்கள் பிளேயருக்கு குறைவாகவே தெரியும்.
செயல்படுத்தல்: இது கணிசமாக மிகவும் சிக்கலானது.
- CPU இல், கேமரா ஃபிரஸ்டத்தை 2-4 அடுக்குகளாகப் பிரிக்கவும்.
- ஒவ்வொரு அடுக்குக்கும், ஃபிரஸ்டத்தின் அந்தப் பகுதியைச் சரியாக உள்ளடக்கிய ஒளிக்கு இறுக்கமாகப் பொருந்தக்கூடிய ஒரு ஆர்த்தோகிராஃபிக் ப்ரொஜெக்ஷன் மேட்ரிக்ஸைக் கணக்கிடவும்.
- ரெண்டரிங் லூப்பில், ஆழப் பாஸை பலமுறை செய்யவும் - ஒவ்வொரு அடுக்குக்கும் ஒருமுறை, வேறுபட்ட நிழல் வரைபடத்திற்கு (அல்லது ஒரு டெக்ஸ்சர் அட்லஸின் ஒரு பகுதிக்கு) ரெண்டரிங் செய்யவும்.
- இறுதி காட்சிப் பாஸ் ஃபிராக்மென்ட் ஷேடரில், தற்போதைய ஃபிராக்மென்ட் கேமராவிலிருந்து அதன் தூரத்தின் அடிப்படையில் எந்த அடுக்குக்கு சொந்தமானது என்பதைத் தீர்மானிக்கவும்.
- நிழலைக் கணக்கிட பொருத்தமான அடுக்கின் நிழல் வரைபடத்தை மாதிரியாக எடுக்கவும்.
பயன்: பரந்த தூரங்களில் சீரான உயர்-தெளிவுத்திறன் நிழல்களை வழங்குகிறது, இது வெளிப்புற சூழல்களுக்கு ஏற்றதாக அமைகிறது.
மாறுபாடு நிழல் வரைபடங்கள் (VSM)
VSM என்பது மென்மையான நிழல்களை உருவாக்குவதற்கான மற்றொரு நுட்பமாகும், ஆனால் இது PCF இலிருந்து வேறுபட்ட அணுகுமுறையை எடுக்கிறது.
கருத்து: நிழல் வரைபடத்தில் ஆழத்தை மட்டும் சேமிப்பதற்குப் பதிலாக, VSM இரண்டு மதிப்புகளைச் சேமிக்கிறது: ஆழம் (முதல் தருணம்) மற்றும் ஆழத்தின் வர்க்கம் (இரண்டாவது தருணம்). இந்த இரண்டு மதிப்புகள் ஆழப் பரவலின் மாறுபாட்டைக் கணக்கிட நம்மை அனுமதிக்கின்றன. செபிஷேவின் சமத்துவமின்மை எனப்படும் ஒரு கணிதக் கருவியைப் பயன்படுத்தி, ஒரு ஃபிராக்மென்ட் நிழலில் இருப்பதற்கான நிகழ்தகவை நாம் மதிப்பிடலாம். முக்கிய நன்மை என்னவென்றால், ஒரு VSM டெக்ஸ்சரை நிலையான வன்பொருள்-முடுக்கப்பட்ட லீனியர் ஃபில்டரிங் மற்றும் மிப்மேப்பிங் ஆகியவற்றைப் பயன்படுத்தி மங்கலாக்க முடியும், இது ஒரு நிலையான ஆழ வரைபடத்திற்கு கணித ரீதியாக செல்லுபடியாகாது. இது நிலையான செயல்திறன் செலவில் மிக பெரிய, மென்மையான மற்றும் மிருதுவான நிழல் பெனும்ப்ராக்களை அனுமதிக்கிறது.
குறைபாடு: VSM இன் முக்கிய பலவீனம் "ஒளிக் கசிவு" ஆகும், அங்கு ஒன்றுடன் ஒன்று மறைக்கும் பொருட்களின் சூழ்நிலைகளில் ஒளி பொருட்களின் வழியாக கசிவது போல் தோன்றலாம், ஏனெனில் புள்ளிவிவர தோராயம் உடைந்து போகக்கூடும்.
அத்தியாயம் 5: நடைமுறைச் செயலாக்க குறிப்புகள் & செயல்திறன்
உங்கள் நிழல் வரைபடத்தின் தெளிவுத்திறனைத் தேர்ந்தெடுத்தல்
உங்கள் நிழல் வரைபடத்தின் தெளிவுத்திறன் தரம் மற்றும் செயல்திறனுக்கு இடையேயான நேரடி வர்த்தகமாகும். ஒரு பெரிய டெக்ஸ்சர் கூர்மையான நிழல்களை வழங்குகிறது, ஆனால் அதிக வீடியோ நினைவகத்தை நுகர்கிறது மற்றும் ரெண்டர் செய்வதற்கும் மாதிரி எடுப்பதற்கும் அதிக நேரம் எடுக்கும். பொதுவான அளவுகள் பின்வருமாறு:
- 1024x1024: பல பயன்பாடுகளுக்கு ஒரு நல்ல அடிப்படை.
- 2048x2048: டெஸ்க்டாப் பயன்பாடுகளுக்கு குறிப்பிடத்தக்க தர மேம்பாட்டை வழங்குகிறது.
- 4096x4096: உயர் தரம், பெரும்பாலும் ஹீரோ சொத்துக்களுக்கு அல்லது வலுவான கலிங் கொண்ட என்ஜின்களில் பயன்படுத்தப்படுகிறது.
ஒளியின் ஃபிரஸ்டத்தை மேம்படுத்துதல்
உங்கள் நிழல் வரைபடத்தில் உள்ள ஒவ்வொரு பிக்சலிலிருந்தும் அதிகப் பலனைப் பெற, ஒளியின் ப்ரொஜெக்ஷன் கன அளவு (அதன் ஆர்த்தோகிராஃபிக் பெட்டி அல்லது பெர்ஸ்பெக்டிவ் ஃபிரஸ்டம்) நிழல்கள் தேவைப்படும் காட்சி கூறுகளுக்கு முடிந்தவரை இறுக்கமாகப் பொருத்தப்படுவது முக்கியம். ஒரு திசை ஒளிக்கு, இது அதன் ஆர்த்தோகிராஃபிக் ப்ரொஜெக்ஷனை கேமராவின் ஃபிரஸ்டத்தின் புலப்படும் பகுதிக்கு மட்டுமே பொருந்தச் செய்வதாகும். நிழல் வரைபடத்தில் எந்த வீணடிக்கப்பட்ட இடமும் வீணடிக்கப்பட்ட தெளிவுத்திறன் ஆகும்.
WebGL நீட்டிப்புகள் மற்றும் பதிப்புகள்
WebGL 1 vs. WebGL 2: WebGL 1 இல் நிழல் மேப்பிங் சாத்தியம் என்றாலும், WebGL 2 இல் இது மிகவும் எளிதாகவும் திறமையாகவும் உள்ளது. WebGL 1 க்கு ஒரு ஆழ டெக்ஸ்சரை உருவாக்க `WEBGL_depth_texture` நீட்டிப்பு தேவைப்படுகிறது. WebGL 2 இந்த செயல்பாட்டை உள்ளமைக்கப்பட்டதாகக் கொண்டுள்ளது. மேலும், WebGL 2 நிழல் சாம்பிளர்களுக்கு (`sampler2DShadow`) அணுகலை வழங்குகிறது, இது வன்பொருள்-முடுக்கப்பட்ட PCF ஐச் செய்ய முடியும், இது ஷேடரில் உள்ள கையேடு PCF லூப்களை விட குறிப்பிடத்தக்க செயல்திறன் ஊக்கத்தை வழங்குகிறது.
நிழல்களை பிழைதிருத்தம் செய்தல்
நிழல்களைப் பிழைதிருத்தம் செய்வது மிகவும் கடினம். மிக பயனுள்ள ஒற்றை நுட்பம் நிழல் வரைபடத்தைக் காட்சிப்படுத்துவது ஆகும். ஒரு குறிப்பிட்ட ஒளி மூலத்திலிருந்து ஆழ டெக்ஸ்சரை நேரடியாக திரையில் ஒரு குவாட் மீது ரெண்டர் செய்ய உங்கள் பயன்பாட்டை தற்காலிகமாக மாற்றவும். இது ஒளி "என்ன பார்க்கிறது" என்பதை நீங்கள் சரியாகப் பார்க்க அனுமதிக்கிறது. இது உங்கள் ஒளியின் மேட்ரிக்ஸ்கள், ஃபிரஸ்டம் கலிங் அல்லது ஆழப் பாஸின் போது பொருள் ரெண்டரிங் தொடர்பான சிக்கல்களை உடனடியாக வெளிப்படுத்த முடியும்.
முடிவுரை
நிகழ்நேர நிழல் மேப்பிங் நவீன 3D கிராபிக்ஸின் ஒரு மூலக்கல்லாகும், இது தட்டையான, உயிரற்ற காட்சிகளை நம்பகமான மற்றும் ஆற்றல்மிக்க உலகங்களாக மாற்றுகிறது. ஒரு ஒளியின் பார்வையில் இருந்து ரெண்டரிங் செய்யும் கருத்து எளிமையானது என்றாலும், உயர்தர, பிழையில்லாத முடிவுகளை அடைவதற்கு, இரண்டு-பாஸ் பைப்லைனிலிருந்து ஆழ பயாஸ் மற்றும் அலியாசிங்கின் நுணுக்கங்கள் வரை அடிப்படை இயக்கவியலைப் பற்றிய ஆழமான புரிதல் தேவைப்படுகிறது.
ஒரு அடிப்படைச் செயலாக்கத்துடன் தொடங்குவதன் மூலம், நிழல் முகப்பரு மற்றும் கரடுமுரடான விளிம்புகள் போன்ற பொதுவான பிழைகளை நீங்கள் படிப்படியாகச் சமாளிக்கலாம். அங்கிருந்து, மென்மையான நிழல்களுக்கு PCF அல்லது பெரிய அளவிலான சூழல்களுக்கு அடுக்கு நிழல் வரைபடங்கள் போன்ற மேம்பட்ட நுட்பங்களுடன் உங்கள் காட்சிகளை உயர்த்தலாம். நிழல் ரெண்டரிங் பயணம், கணினி வரைகலையை மிகவும் கவர்ச்சிகரமானதாக மாற்றும் கலை மற்றும் அறிவியலின் கலவையின் ஒரு சரியான எடுத்துக்காட்டு. இந்த நுட்பங்களை பரிசோதிக்கவும், அவற்றின் எல்லைகளைத் தள்ளவும், உங்கள் WebGL திட்டங்களுக்கு ஒரு புதிய அளவிலான யதார்த்தத்தைக் கொண்டு வரவும் நாங்கள் உங்களை ஊக்குவிக்கிறோம்.