आस्थगित छायांकन - कैसे कई रोशनी गठबंधन करने के लिए?


9

मैं जीएलएसएल के साथ शुरुआत कर रहा हूं और मैंने सरल आस्थगित छायांकन लागू किया है जो पदों, मानदंडों और अल्बेडो के साथ जी-बफर को आउटपुट करता है।

मैंने एक साधारण बिंदु लाइट शेडर भी लिखा है।

अब मैं बिंदु प्रकाश के लिए एक गोले को खींचता हूं और आउटपुट एक प्रकाश बफर में चला जाता है।

समस्या यह है कि मैं कई रोशनी खींचते समय प्रकाश बफर के परिणामों को कैसे जोड़ूं?

उदाहरण के लिए, जब मैं पॉइंट लाइट शेडर का उपयोग करके लाइटबफ़र के लिए दूसरी रोशनी खींच रहा हूं, तो मैं प्रकाश बफर में पहली रोशनी को दूसरी रोशनी में कैसे जोड़ूं। मेरा मतलब है, आप एक ही आउटपुट बफर से पढ़ सकते हैं और नहीं लिख सकते हैं?

जवाबों:


12

Additive सम्मिश्रण, यानी glBlendFunc (GL_ONE, GL_ONE) और glEnable (GL_ONE)।


क्या गहराई परीक्षण को इसके लिए अक्षम करना होगा?
woojoo666

1
@ woojoo666 नहीं। वास्तव में इसे कम-बराबर करने के लिए निर्धारित गहराई परीक्षण के साथ सक्षम किया जाना चाहिए, ताकि पिछले पास से मेल खाने वाली सतहें गुजरें। यदि गहराई परीक्षण बंद है, तो सतहों को गलत तरीके से उनके पीछे के प्रकाश से संचित किया जाएगा। :)
नाथन रीड

हम्म, ऐसा लगता है कि वास्तव में क्या हो रहा है। सम्मिश्रण करने से सामने वाले के चेहरे पीछे से घुलते मिलते हैं, भले ही मैंने गहराई से जांच की हो। क्या मुझे गहराई से मास्क के साथ भी कुछ करने की ज़रूरत है?
woojoo666

थोड़ा और परीक्षण किया, ड्रॉ ऑर्डर मामलों की तरह लगता है (फ्रंट-टू-बैक ड्रॉ करना गहराई-परीक्षण का काम सही ढंग से करता है और मिश्रण केवल तभी होता है जब चेहरे सुसज्जितकर्ता होते हैं, बैक-टू-फ्रंट सब कुछ एक साथ मिश्रण करता है)। क्या हर चीज को छांटे बिना ऐसा करने का कोई तरीका है?
woojoo666

2
@ woojoo666 अहा, लगता है आपने इसे अपने दम पर हल कर लिया। हां, आपको किसी भी प्रकार के सम्मिश्रण का उपयोग करने से पहले एक अपारदर्शी पास में गहराई तक लेटना होगा। यह रंग के साथ एक जेड-प्रीपास हो सकता है, जिसमें रंग अक्षम होता है, या दूसरा सामान्य तरीका यह है कि पहले सम्मिश्रण में बिना किसी सम्मिश्रण के साथ परिवेश / दिशात्मक प्रकाश करें, फिर बाद में सम्मिश्रण के साथ बिंदु / स्पॉट लाइट जोड़ें।
नाथन रीड

2

मेरे आस्थगित रेंडरर के लिए, मैं जी-बफर से जानकारी का उपयोग करके सभी लाइट्स को एक लाइट रेंडर टारगेट में एग्रीगेट करता हूं और फिर सैंपल देता हूं जो कि मेरी फाइनल बैकबफ़र इमेज बनाते समय लाइट इंटेंसिटी के लिए टारगेट रेंडर करता है।

इसलिए मूल रूप से, मैं जी-बफ़र्स बनाने के लिए अपने सभी गेम ज्यामिति को अपने ज्यामिति पास से चलाता हूं। वहाँ से मैं अपने प्रकाश पास shader को g- बफ़र खिलाता हूँ। प्रत्येक प्रकाश पूर्ण स्क्रीन क्वाड का उपयोग करते हुए पास से होकर जाता है। इस तरह मेरा पिक्सेल shader जी-बफर से सभी दृश्य सतहों के लिए प्रकाश की तीव्रता की गणना कर सकता है और फिर उन्हें प्रकाश रेंडर लक्ष्य में जोड़ सकता है। आप बस प्रत्येक प्रकाश के लिए प्रकाश की तीव्रता को प्रकाश बफर में जोड़ते हैं, लेकिन सुनिश्चित करें कि आप तीव्रता को 0 से 1 तक जकड़ें।

आपको विभिन्न प्रकार की रोशनी (बिंदु, स्पॉटलाइट, समानांतर) को संभालने के लिए करने की आवश्यकता होगी, जो कि प्रकाश प्रक्रियाओं को निष्पादित करने के लिए एक निरंतर बफर का उपयोग करके संभवतः प्रकाश को और अधिक मजबूत बनाने के लिए है।


हाँ, और सवाल यह है - आप प्रकाश को कैसे जोड़ते हैं लक्ष्य? नथन रीड सुझाव के रूप में अल्फा सम्मिश्रण का उपयोग करना? क्योंकि जहां तक ​​मुझे पता है आप उसी आउटपुट बफर से नहीं पढ़ सकते हैं और लिख सकते हैं (जो इस मामले में प्रकाश बफर है)।
जेबेरियर

उफ़, हाँ। मैंने एडिटिव ब्लेंडिंग के साथ आउटपुट मर्जर को हैंडल करने दिया। जब अंतिम छवि के लिए नमूनाकरण तब होता है जब आप मूल्य को उस पर दबाना चाहते हैं जो मेरे लिए अधिकतम संभव प्रकाश तीव्रता के रूप में काम करता है जो एक सतह प्राप्त कर सकता है। वहां से आप अपनी रोशनी को आवश्यकतानुसार माप सकते हैं।
क्लाशनिकोवकिड

आप उन मामलों को कैसे संभालते हैं जहां एक दीवार के पीछे एक प्रकाश होता है और दीवार के दूसरी तरफ की चीजों को प्रकाश नहीं देना चाहिए?
jjxtra

@PychoDad छाया का वह डोमेन है, जो ... एक अधिक जटिल विषय है। :)
नाथन रीड

0

इससे बेहतर उत्तर होने की संभावना है, लेकिन मुझे पता है, यदि आपकी छाया में आप दूसरी रोशनी करने के लिए आवश्यक कोड दोहराते हैं, तो आप एक के बजाय एक ही वस्तु पर दो रोशनी कर सकते हैं। इसके लिए दूसरी लाइट के लिए बहुत सारे कोड की आवश्यकता होती है और थोड़ी सी बेमानी हो जाती है, लेकिन मुझे पता है कि यह काम करता है। हालांकि, मुझे विश्वास है, क्योंकि कोई आपके लिए उम्मीद से इशारा करेगा, एक और अधिक सुंदर समाधान हो सकता है।


नहीं, यह उस तरह से काम नहीं करता है। मैं प्रत्येक बिंदु प्रकाश के लिए एक क्षेत्र बनाता हूं। जब तक दूसरा बिंदु प्रकाश पहले प्रकाश के प्रभाव के क्षेत्र के साथ नहीं होता है, तब तक दूसरा प्रकाश बस अभ्यस्त नहीं होगा। यदि मैं सभी बिंदुओं के लिए एक फुलस्क्रीन क्वाड खींचता हूं, तो आपका तरीका काम करेगा, हालांकि, यह सही तरीका नहीं है क्योंकि फुलस्क्रीन क्वाड्स का उपयोग वैश्विक इल्यूमिनेशन के लिए किया जाता है। कहो कि मेरे पास 16 छोटे बिंदु हैं, जो मुझे प्रत्येक पिक्सेल के लिए उनके माध्यम से जाने के लिए मजबूर करेगा, भले ही पिक्सेल इसके द्वारा जलाया न हो। और आमतौर पर मैं कहता हूं कि प्रत्येक पिक्सेल एक या दो रोशनी से जलाया जाता है। और क्या होगा अगर मेरे पास 100 रोशनी है? NO
जेबीर

मुख्य कारण मैंने यह कहा है, अगर आप केवल दो या कुछ रोशनी का उपयोग कर रहे हैं, तो यह मदद कर सकता है। खासकर यदि आप कई वस्तुएं चला रहे हैं, तो मिश्रण का उपयोग करने का मतलब है कि आपको प्रत्येक प्रकाश के लिए दृश्य को फिर से तैयार करने की आवश्यकता है, इसलिए यदि आपके पास बहुत सी आकृतियाँ हैं, तो एक मिलियन या दस मिलियन या एक अरब कहें, प्रत्येक ड्रॉ में बहुत अधिक लागत आती है । यदि आप बहुत सारी लाइट्स चाहते हैं, तो इसे shader में करने से समस्याएँ उत्पन्न होती हैं, लेकिन यदि आप बहुत सारी आकृतियाँ चाहते हैं, तो समस्याएँ उत्पन्न करती हैं। यदि आपके पास दोनों बहुत सारे हैं, तो आपको एक मध्य मैदान खोजने की आवश्यकता है, लेकिन आमतौर पर आपके पास कुछ रोशनी और खेल में बहुत सारी वस्तुएं होती हैं।
कोडनेको

नहीं, स्थगित छायांकन उस तरह से काम नहीं करता है। मुझे केवल एक बार दृश्य खींचना है और जी-बफर में प्रासंगिक जानकारी संग्रहीत करनी है। फिर प्रत्येक प्रकाश के लिए प्रभाव क्षेत्र और इसे प्रकाश बफर के साथ मिलाएं। और आखिर में colorbuffer के साथ लाइट बफ़र को मिलाते हुए मुझे फाइनल शेडेड कलर बफ़र मिलता है। प्रकाश की गणना की मात्रा दृश्य जटिलता पर निर्भर नहीं करती है। यह पहली जगह में आस्थगित छायांकन का मुख्य लाभ है।
22 मई को JBeurer

आह, यह एक बहुत अधिक समझ में आता है और काफी बेहतर होगा।
कोडनेको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.