इससे निपटने के लिए आम तौर पर दो तरीके हैं। आजकल, वे आगे प्रतिपादन और आस्थगित प्रतिपादन कहलाते हैं। इन दोनों में एक भिन्नता है कि मैं नीचे चर्चा करूंगा।
आगे प्रतिपादन
प्रत्येक वस्तु को एक बार प्रत्येक प्रकाश के लिए प्रस्तुत करें जो इसे प्रभावित करता है। इसमें परिवेश प्रकाश शामिल है। आप एक additive मिश्रण मोड ( glBlendFunc(GL_ONE, GL_ONE)
) का उपयोग करते हैं , इसलिए प्रत्येक प्रकाश के योगदान को एक दूसरे में जोड़ा जाता है। चूंकि विभिन्न लाइट्स का योगदान एडिटिव है, इसलिए फ्रेमबफ़र को अंततः वैल्यू मिलती है
आप एक फ्लोटिंग-पॉइंट फ्रेमबफ़र को प्रस्तुत करके एचडीआर प्राप्त कर सकते हैं। फिर आप दृश्यमान रेंज में एचडीआर प्रकाश मूल्यों को डाउन-स्केल करने के लिए दृश्य पर एक अंतिम पास लेते हैं; यह वह जगह भी होगी जहां आप ब्लूम और अन्य पोस्ट-इफेक्ट लागू करते हैं।
इस तकनीक के लिए एक सामान्य प्रदर्शन वृद्धि (यदि दृश्य में बहुत सी वस्तुएं हैं) "प्री-पास" का उपयोग करना है, जहां आप सभी वस्तुओं को बिना रंग फ्रेमबॉफ़र के कुछ भी आकर्षित किए बिना उपयोग करते हैं ( glColorMask
रंग लिखने को बंद करने के लिए)। यह सिर्फ गहराई बफर में भर जाता है। इस तरह, यदि आप किसी ऐसी वस्तु को प्रस्तुत करते हैं जो दूसरे के पीछे है, तो GPU जल्दी से उन अंशों को छोड़ सकता है। यह अभी भी शीर्ष shader को चलाने के लिए है, लेकिन यह आमतौर पर अधिक महंगे टुकड़े shader कंप्यूटर्स को छोड़ सकता है।
यह कोड के लिए सरल है और कल्पना करना आसान है। और कुछ हार्डवेयर (मुख्य रूप से मोबाइल और एम्बेडेड GPU) पर, यह विकल्प की तुलना में अधिक कुशल हो सकता है। लेकिन उच्च अंत हार्डवेयर पर, विकल्प आमतौर पर बहुत सी रोशनी वाले दृश्यों के लिए जीतता है।
आस्थगित प्रतिपादन
आस्थगित प्रतिपादन थोड़ा अधिक जटिल है।
सतह पर एक बिंदु के लिए प्रकाश की गणना करने के लिए आपके द्वारा उपयोग किए जाने वाले प्रकाश समीकरण निम्नलिखित सतह मापदंडों का उपयोग करता है:
- सतह की स्थिति
- सतही मानदंड
- सतह रंग फैलाना
- भूतल स्पेकुलर रंग
- भूतल स्पेक्युलर शाइननेस
- संभवतः अन्य सतह पैरामीटर (आपके प्रकाश समीकरण कितना जटिल है इसके आधार पर)
फ़ॉरवर्ड रेंडरिंग में, ये पैरामीटर्स फ़्रेमर शैडर के लाइटिंग फंक्शन को या तो वर्टेक्स शेडर से सीधे पास करके, टेक्सचर्स से खींचे जाने पर (आमतौर पर वर्टेक्स शेडर से पास किए गए टेक्सटाइल कोऑर्डिनेट्स के माध्यम से) में मिल जाते हैं, या फ़्रेग्मेंट शैडर में पूरे कपड़े से उत्पन्न होते हैं। अन्य मापदंडों। फैलाना रंग एक बनावट के साथ प्रति-शीर्ष रंग के संयोजन से गणना की जा सकती है, कई बनावटों को मिलाकर, जो भी हो।
आस्थगित प्रतिपादन में, हम यह सब स्पष्ट करते हैं। पहली पास में, हम सभी वस्तुओं को प्रस्तुत करते हैं। लेकिन हम रंगों को प्रस्तुत नहीं करते हैं । इसके बजाय, हम सतह मापदंडों को प्रस्तुत करते हैं । इसलिए स्क्रीन पर प्रत्येक पिक्सेल में सतह मापदंडों का एक सेट होता है। यह ऑफ-स्क्रीन बनावट के प्रतिपादन के माध्यम से किया जाता है। एक बनावट अपने आरजीबी के रूप में फैलाने वाले रंग को स्टोर करेगी, और संभवतः अल्फा के रूप में स्पेक्युलर चमक को। एक अन्य बनावट स्पेक्युलर कलर को स्टोर करेगी। एक तीसरा सामान्य संग्रह करेगा। और इसी तरह।
स्थिति आमतौर पर संग्रहीत नहीं होती है। इसके बजाय गणित द्वारा दूसरे पास में पुनर्गठित किया जाता है जो यहां तक पहुंचने के लिए बहुत जटिल है। यह कहने के लिए पर्याप्त है, हम सतह पर बिंदु के कैमरा-स्थान की स्थिति का पता लगाने के लिए इनपुट के रूप में गहराई बफर और स्क्रीन-स्पेस टुकड़ा स्थिति का उपयोग करते हैं।
इसलिए, अब जब ये बनावट दृश्य के हर दृश्य पिक्सेल के लिए सतह की सभी जानकारी अनिवार्य रूप से रखती है, तो हम पूर्ण-स्क्रीन क्वाड प्रस्तुत करना शुरू करते हैं। प्रत्येक प्रकाश को एक पूर्ण-स्क्रीन क्वाड रेंडर मिलता है। हम सतह पैरामीटर बनावट से नमूना लेते हैं (और स्थिति को पुनर्गठित करते हैं), तो बस उन्हें उस प्रकाश के योगदान की गणना करने के लिए उपयोग करें। यह glBlendFunc(GL_ONE, GL_ONE)
छवि में (फिर से ) जोड़ा गया है । हम ऐसा तब तक करते रहते हैं जब तक हम रोशनी से बाहर नहीं निकल जाते।
एचडीआर फिर से एक प्रक्रिया के बाद का कदम है।
आस्थगित प्रतिपादन के लिए सबसे बड़ा नकारात्मक है एंटीएलियासिंग। यह ठीक से एंटीएलियास के लिए थोड़ा और काम करने की आवश्यकता है।
सबसे बड़ा उल्टा, अगर आपके GPU में मेमोरी बैंडविड्थ बहुत अधिक है, तो यह प्रदर्शन है। हम केवल वास्तविक ज्यामिति को एक बार (या 1 + 1 प्रति प्रकाश जो छाया है, यदि हम छाया मानचित्रण कर रहे हैं) प्रस्तुत करते हैं। हम कभी भी छिपे हुए पिक्सेल या ज्यामिति पर नहीं बिताते हैं जो इसके बाद दिखाई नहीं देता है। लाइटिंग पास का सारा समय उन चीजों पर खर्च किया जाता है जो वास्तव में दिखाई देती हैं।
यदि आपके GPU में बहुत अधिक मेमोरी बैंडविड्थ नहीं है, तो लाइट पास वास्तव में चोट करना शुरू कर सकता है। स्क्रीन पिक्सेल प्रति 3-5 बनावट से खींचना मज़ेदार नहीं है।
लाइट प्री-पास
यह आस्थगित प्रतिपादन पर एक बदलाव की तरह है जिसमें दिलचस्प ट्रेडऑफ़ हैं।
बस के रूप में आस्थगित प्रतिपादन में, आप अपने सतह मापदंडों को बफ़र्स के एक सेट में प्रस्तुत करते हैं। हालाँकि, आपने सतह डेटा संक्षिप्त किया है; इस समय आप जिस एकमात्र सतह डेटा की देखभाल करते हैं, वह है गहराई बफर मान (स्थिति को फिर से संगठित करने के लिए), सामान्य, और स्पेक्युलर चमक।
फिर प्रत्येक प्रकाश के लिए, आप केवल प्रकाश परिणामों की गणना करते हैं। सतह के रंगों के साथ कोई गुणा नहीं, कुछ भी नहीं। बस डॉट (एन, एल), और स्पेक्युलर शब्द, पूरी तरह से सतह के रंगों के बिना। स्पेक्युलर और फैलाना शब्दों को अलग-अलग बफ़र्स में रखा जाना चाहिए। प्रत्येक प्रकाश के लिए स्पेक्युलर और फैलाना शब्द दो बफ़र्स के भीतर सम्मिलित हैं।
फिर, आप ज्यामिति को फिर से प्रस्तुत करते हैं, कुल स्पेक्युलर का उपयोग करते हुए और सतह के रंग के साथ अंतिम संयोजन करने के लिए प्रकाश संगणना को फैलाते हैं, इस प्रकार समग्र प्रतिबिंब का निर्माण करते हैं।
यहाँ अपसाइड यह है कि आपको मल्टीसमैपलिंग वापस मिलती है (कम से कम, आस्थगित से आसान)। आप अग्रेषित रेंडरिंग की तुलना में कम प्रति-ऑब्जेक्ट रेंडरिंग करते हैं। लेकिन मुख्य बात यह है कि यह प्रदान करता है अलग सतहों के लिए अलग प्रकाश व्यवस्था समीकरणों के लिए एक आसान समय है।
आस्थगित प्रतिपादन के साथ, आप आमतौर पर पूरे दृश्य को एक ही shader प्रति-प्रकाश के साथ आकर्षित करते हैं। इसलिए प्रत्येक वस्तु को एक ही भौतिक मापदंडों का उपयोग करना चाहिए। लाइट प्री-पास के साथ, आप प्रत्येक ऑब्जेक्ट को एक अलग शेडर दे सकते हैं, इसलिए यह अपने आप अंतिम लाइटिंग स्टेप कर सकता है।
यह आगे प्रदान करने के मामले के रूप में ज्यादा स्वतंत्रता प्रदान नहीं करता है। लेकिन यह अभी भी तेज है अगर आपके पास स्पेयर करने के लिए बनावट बैंडविड्थ है।