कई शेड का उपयोग करना


53

मैं वर्तमान में ओपेंगल शेड्स का अध्ययन कर रहा हूं, लेकिन मैं कुछ पता नहीं लगा सकता हूं: वस्तुओं के लिए अलग-अलग रंगों को कैसे लागू किया जाए, उदाहरण के लिए, टॉन शेडर का उपयोग करके प्रदान किया गया एक चायदानी और एक ही दृश्य में एक बहुत ही चिंतनशील सतह और अन्य विकृत का उपयोग करके। एक शोर समारोह, इस वीडियो में पसंद है

http://www.youtube.com/watch?v=1ogg4ZfdBqU

एक अन्य एक दृश्य में एक ब्लोमर शेडर और एक मोशन ब्लर शैडर बाद में लगा रहा है। उन प्रभावों को कैसे प्राप्त किया जाए जब आप केवल एक शीर्ष shader और एक टुकड़ा shader कर सकते हैं? क्या कोई ट्रिक है जैसे कि एक से अधिक शेडर प्रोग्राम का उपयोग करना?


रे नाथन और डेविड के अच्छे उत्तर, यही कारण है कि आप शब्द रेंडर पास या शेडर पास देखते हैं ; अंतिम छवि / फ्रेम की रचना के लिए कई पास आवश्यक हैं। एक कारण है कि GPU प्रसंस्करण इतना शापित समानांतर हो गया है और इस तरह इतनी तेजी से प्रति फ्रेम एकाधिक पास की आवश्यकता है। क्वेक II या हाफ लाइफ सॉफ्टवेयर रेंडरर्स को अपने आप को याद दिलाने के लिए वापस जाएं कि पूरे 3 डी ग्राफिक्स अनुभव में कितना प्यार मिलाप पास करता है।
इंजीनियर

जवाबों:


59

सरल उत्तर यह है कि आप प्रत्येक ड्रॉ कॉल के बीच उन्हें बदल सकते हैं। एक shader सेट करें, एक चायदानी खींचें, दूसरा shader सेट करें, दूसरा चायदानी ड्रा करें।

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

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

एक और तकनीक है जिसे डिफर्ड शेडिंग कहा जाता है जहां आप बिना रोशनी के दृश्य प्रस्तुत करते हैं और बाद में इसे स्क्रीन स्पेस में लागू करते हैं। मुख्य लक्ष्य प्रति पिक्सेल प्रकाश व्यवस्था के खर्च को कम करना है।

आम तौर पर आप एक रंगीन बफर प्रस्तुत करते हैं जो स्क्रीन पर डाला जाता है। आस्थगित छायांकन के साथ आप इसके बजाय एक रंग बफर के साथ-साथ एक शैडर पास में एक सामान्य और गहराई बफर प्रस्तुत करते हैं (आप सामान्य वैक्टर और गहराई को सामान्य और ऊंचाई मानचित्रण की तरह बनावट में संग्रहीत कर सकते हैं)।

इसका मतलब है कि, प्रत्येक पिक्सेल के लिए, आप रंग और सामान्य गैर-पारदर्शी ज्यामिति (गहराई या आंख से दूरी) के निकटतम टुकड़े की स्थिति जानते हैं। इसके कारण आप स्क्रीन पर प्रत्येक पिक्सेल के लिए प्रकाश व्यवस्था को लागू कर सकते हैं जो आपके द्वारा प्रस्तुत प्रत्येक वस्तु के प्रत्येक दृश्यमान पिक्सेल के बजाय। याद रखें कि यदि दृश्य पूरी तरह से बैक ऑर्डर के सामने प्रस्तुत नहीं किया गया है, तो कुछ ऑब्जेक्ट को अन्य ऑब्जेक्ट्स के ऊपर खींचा जाएगा।

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

और अधिक आधुनिक ओपन (3.0+) के साथ आप एक का उपयोग फ्रेमबफर वस्तु Renderbuffers के साथ संलग्न ऑब्जेक्ट है। चूंकि रेंडरबफर्स ​​को एक बनावट की तरह माना जा सकता है। आप जैसी चीजों 1 शेडर सी अलग-अलग renderbuffers को प्रस्तुत करना है हो सकता है (ताकि आप फिर अपने normals अपने बनावट प्रस्तुत करना की जरूरत नहीं है तो चमक घटक) लेकिन अंतर्निहित अभ्यास अब भी वही है।

ओवरहेड पर सहेजने के लिए जितना संभव हो सके, कम से कम shader स्विच की संख्या को कम करना वांछनीय है। तो कुछ इंजन एक साथ एक ही सामग्री के साथ सब कुछ समूहित करेंगे ताकि यह सब एक साथ खींचा जा सके।


16

आप बस एक shader को बांधते हैं, उस shader का उपयोग करके सभी ऑब्जेक्ट्स को रेंडर करते हैं, फिर अगले shader को बाँधते हैं, एक का उपयोग करके ऑब्जेक्ट्स को रेंडर करते हैं, आदि।

आपके पास जितनी चाहें उतनी शेडर ऑब्जेक्ट्स (मेमोरी में लोड किए गए शेड्स और संकलित) हो सकते हैं; केवल एक समय में बाध्य (सक्रिय) हो सकता है।


5
कार्यान्वयन के संदर्भ में, हर फ्रेम में मैं शेड्स बदलने के लिए glUseProgram (1) और glUseProgram (2) का उपयोग करता हूं? प्रदर्शन के लिए कितना महंगा है?
ibrabeicker

4
यह एक nontrivial लागत है (हालांकि पहले की तुलना में हाल के GPU पर कम)। यही कारण है कि अधिकांश लोग अपनी वस्तुओं को सामग्री द्वारा क्रमबद्ध करते हैं, सभी वस्तुओं को एक ही सामग्री के साथ प्रदान करते हैं। लेकिन आप निश्चित रूप से कार्यक्रमों को प्रति फ्रेम सैकड़ों बार बदल सकते हैं, यदि अधिक नहीं।
नाथन रीड

9

एक दृश्य में एक से अधिक shader का उपयोग करना काफी सरल है; शेडर बदलें, इसके लिए मान सेट करें, फिर ऑब्जेक्ट रेंडर करें।

हालांकि, खबरदार, स्विचिंग शेड्स महंगे हो सकते हैं, इसलिए शेडर स्विचिंग को नंगे न्यूनतम रखा जाना चाहिए। इस प्रभाव को कम करने के कुछ तरीके हैं जबकि आप चाहते हैं कि सभी प्रभावों को प्राप्त कर रहे हैं।

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

प्रदर्शन प्रभाव को कम करने का दूसरा तरीका शेडर को सेट करना है, उस शैडर का उपयोग करने वाली प्रत्येक वस्तु को प्रस्तुत करना, फिर दोहराना। दूसरे शब्दों में, अपने प्रतिपादन बैचिंग।

यदि आप एक ही वस्तु पर दो अलग-अलग प्रभाव लागू करना चाहते हैं (जैसे कि एक ऑनर शेडर लागू करें तो कुछ प्रकाश व्यवस्था) आप इसे दो अलग-अलग तरीकों से कर सकते हैं। सबसे पहले एक shader लिखना है जो एक ही फ़ंक्शन में कई प्रभाव लागू करता है। दूसरा तरीका यह है कि प्रत्येक शेडर के साथ एक बार मॉडल को रेंडर किया जाए और अलग-अलग ब्लेंड ऑप्शंस सेट करके रिजल्ट्स को ब्लेंड किया जाए। हालांकि, यह एक बहुत अधिक काम है, और सभी परिस्थितियों में प्राप्त करने योग्य नहीं है। इसलिए सबसे अच्छा विकल्प अपने सभी प्रभावों को एक shader में संयोजित करना है।


7

मुझे पता चला है कि करने का एक अन्य तरीका glsl सबरूटीन्स नामक कुछ के माध्यम से है, जहां प्रत्येक प्रकार के shader को एक फ़ंक्शन में परिभाषित किया गया है, और OpenGL एप्लिकेशन में, हम वर्तमान सबरूटीन को परिभाषित कर सकते हैं, एक बफर के शीर्ष को खींच सकते हैं, सबरूटीन को बदल सकते हैं और एक और बफर प्रतिपादन


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