ऐसा करने के कई तरीके हैं। इसके लिए एक shader के उपयोग की आवश्यकता होगी और मैं मान रहा हूं कि आप पहले से ही प्रति पिक्सेल प्रकाश व्यवस्था कर रहे हैं। निम्नलिखित कुछ सुझाव हैं, हालांकि आपके लिए सही तकनीक खोजने पर आपको अधिक शोध करना पड़ सकता है।
जल्दी और गन्दी
आप बाउंडिंग बॉक्स निर्दिष्ट कर सकते हैं जो आंतरिक क्षेत्रों को परिभाषित करते हैं। यदि प्रकाश बक्से के बाहर है, लेकिन ज्यामिति (जो छाया में नहीं है) बॉक्स के अंदर है, तो प्रकाश एक खिड़की से गुजरने से प्रभावित हुआ होगा (यह भी सही है यदि ज्यामिति बॉक्स के बाहर है और प्रकाश अंदर है)। यहां एकमात्र मुद्दा यह है कि बॉक्स की जानकारी को shader में कैसे पास किया जाए और प्रकाश पर प्रभाव को कैसे बताया जाए।
एक अन्य विकल्प विमानों पर पड़ी वस्तुओं के रूप में खिड़कियों को निर्दिष्ट करना है। पहले यह देखने के लिए परीक्षण करें कि क्या ज्यामिति और प्रकाश विमान के विपरीत दिशा में हैं और फिर यदि उनके बीच का रास्ता खिड़की की सीमाओं के भीतर एक बिंदु पर विमान को काटता है। यह पहली विधि की तुलना में अधिक सटीक होगा और कांच के विभिन्न रंगों के साथ एक ही अंदरूनी में खिड़कियां रखना आसान होगा।
खिड़कियों के ज्यामितीय प्रतिनिधित्व के साथ और अधिक विस्तृत रखें और आपको अधिक सटीक परिणाम मिलेंगे, लेकिन गणना भी भारी हो जाएगी।
ये तकनीक एक गलियारे के शूटर के लिए यथोचित रूप से अच्छी तरह से काम करेगी, लेकिन एक गतिशील या खुली दुनिया के लिए इतना अच्छा नहीं है क्योंकि बहुत सारी कलाकृतियों के बिना इसे ठीक से देखने की आवश्यकता होगी। इसके अलावा, ये तकनीकें जल्द ही थोड़ी तीव्र हो सकती हैं, इसलिए डिफर्ड शेडिंग पाइपलाइन में जाने की सलाह दी जाएगी।
छाया मानचित्र
एक अन्य विकल्प छाया मानचित्रण के समान कुछ करना है।
छाया मानचित्रण में आप एक प्रकाश से प्रभावित दुनिया की कुछ बिटमैप छवि उत्पन्न करते हैं। प्रत्येक पिक्सेल, जबकि अभी भी एक रंग है, वास्तव में गैर-पारदर्शी ज्यामिति के निकटतम टुकड़े की दूरी है (आप 4 बाइट्स का उपयोग 4 रंगों के बजाय 1 फ्लोट के लिए करते हैं)। यदि आप प्रकाश से ज्यामिति के एक टुकड़े की दूरी की गणना करते हैं और यह छाया मानचित्र में संबंधित मान से आगे है तो आपका ज्यामिति का टुकड़ा छाया में है (आप आमतौर पर ज्यामिति और प्रकाश के बीच की किरण का उपयोग मानचित्र को अनुक्रमित करने के लिए करते हैं)।
यदि आप इस विचार को अपनी समस्या पर लागू करते हैं तो आप क्या करेंगे, निकटतम ज्यामिति के प्रकाश के प्रकाश से दूरी का एक नक्शा संग्रहीत करते हैं, और फिर उस ज्यामिति से गुजरने के बाद प्रकाश के रंग का दूसरा नक्शा भी बनाते हैं ( बस ज्यामिति का रंग यदि प्रकाश सफेद है)।
यदि आपका ज्यामिति का टुकड़ा इस नक्शे में दूरी से अधिक दूर है, तो मानचित्र रंग का उपयोग करें, यदि यह नहीं है तो मूल हल्के रंग का उपयोग करें।
मानचित्र में प्रत्येक पिक्सेल के लिए रंग की गणना करने का कार्य लगभग होना चाहिए; lightColor - उल्टा WindowColor। तो एक शुद्ध सफेद रोशनी और एक शुद्ध लाल खिड़की के लिए जो हमारे द्वारा प्राप्त किसी भी लाल स्पेक्ट्रम को अवशोषित नहीं करती है; (255,255,255) - (0,255,255) = (255,0,0)। तो दूसरी तरफ प्रकाश का रंग शुद्ध लाल है। एक अधिक जटिल पारदर्शी वस्तु के लिए, जैसे कि सना हुआ ग्लास खिड़की, आप सामग्री रंग प्राप्त करने के लिए बनावट की खोज कर सकते हैं।
अगर आप भी कुछ ऐसा ही देख रहे हैं तो रिफ्लेक्टिव शैडो मैप्स देखें ।
यह तकनीक निष्ठा की एक बड़ी मात्रा प्रदान करती है और संभवतः सबसे अच्छा होगा यदि आप जटिल पारदर्शी ज्यामिति का उपयोग करना चाहते हैं जैसे कि सना हुआ ग्लास खिड़कियां।
एक सामान्य समाधान का प्रयास
यह हाल ही में एक voxel प्रतिनिधित्व में प्रकाश जानकारी को एन्कोड करने के लिए लोकप्रिय हो गया है (वे सिर्फ ज्यामिति के लिए नहीं हैं)। नवीनतम क्रायटेक इंजन उन्नत प्रकाश ( प्रकाश प्रसार संस्करणों ) के लिए इस तरह के स्ट्रैटेगी का उपयोग करता है ।
यहाँ सामान्य विचार है:
- समान रूप से रिक्त क्यूब्स का एक नक्शा बनाएं जो आपके दृश्य को सम्मिलित करता है ( जेड-ऑर्डर कर्व्स का उपयोग करके विचार करें )।
- प्रत्येक voxel (गोलाकार हार्मोनिक निरूपण यहाँ उपयोगी हैं) के लिए भंडारण घटना प्रकाश जानकारी का एक तरीका खोजें।
- एक प्रकाश युक्त voxel का पता लगाएं और voxel में उस प्रकाश का प्रतिनिधित्व करें।
- आसन्न स्वरों के माध्यम से बाहर की ओर प्रकाश का प्रचार करें (मिनक्राफ्ट पानी की तरह)
- गणना करें कि प्रत्येक स्वर में ज्यामिति इसके माध्यम से गुजरने वाले प्रकाश को कैसे प्रभावित करेगी (अवशोषित, प्रतिबिंबित, संचारित)
- तब तक दोहराएं जब तक प्रकाश फीका न हो जाए
इस स्वर की जानकारी के निर्माण के कई तरीके हैं, लेकिन ऊपर दी गई सूची एक सामान्य विचार देती है। उदाहरण के लिए; आप शैडो मैप्स / वॉल्यूम उत्पन्न करके शुरू कर सकते हैं और फिर उस सूचना को voxel मैप में प्रोजेक्ट कर सकते हैं ताकि आप सीधे लाइटिंग का मैप बना सकें। फिर आप प्रभावित क्षेत्र के किनारे स्वरों से प्रचार शुरू करते हैं। मेरा ध्यान रखें कि, इस मामले में, आप इस बात को नज़रअंदाज़ करना चाहेंगे कि छाया नक्शा / आयतन बनाते समय ज्यामिति पारदर्शी है या नहीं।
आस्थगित रेंडरर के अंतिम पास में, ज्यामिति के एक बिंदु की रोशनी की गणना करते समय, आप बस ज्यामिति की स्थिति का उपयोग करके अपने voxel मैप को इंडेक्स करते हैं ताकि पता चल सके कि घटना प्रकाश उस स्थान पर कैसा है। तब आप घटना प्रकाश सीपीयू पक्ष का एक स्क्रीन मैप बना सकते हैं, या संभवतः यह क्यूडा के साथ कर सकते हैं।