शेडर वर्दी को अपडेट करने का सबसे अच्छा तरीका क्या है?


10

किसी shader के matrices को आज तक रखने का सबसे स्वीकृत तरीका क्या है, और क्यों?

उदाहरण के लिए, इस समय मेरे पास एक Shaderवर्ग है जो हैंडल को GLSL शेडर प्रोग्राम और वर्दी में संग्रहीत करता है। जब भी मैं कैमरा ले जाता हूं, तब मुझे नए व्यू मैट्रिक्स को शेडर को पास करना होता है, फिर प्रत्येक अलग-अलग विश्व ऑब्जेक्ट को मुझे शेडर को मॉडल मैट्रिक्स पास करना होगा।

यह गंभीर रूप से मुझे सीमित करता है क्योंकि मैं उस shader ऑब्जेक्ट तक पहुंच के बिना कुछ भी नहीं कर सकता।

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


जब प्रस्तुत करने का समय हो, तो डेटा को छायाकारों के पास क्यों नहीं भेजना चाहिए?
निक कैपलिंगर

यही मेरा इरादा है लेकिन कैसे? यदि एक वस्तु एक शेडर बनाता है तो दुनिया की वस्तुओं को उस shader की मौजूदगी के बारे में जानने के लिए और इसे आवश्यक मैट्रिसेस पास करने के लिए कैसे बनाया जाता है?
लेर्प

जवाबों:


11

का प्रयोग करें वर्दी बफ़र्स (यानी निरंतर बफ़र्स D3D शब्दावली में)।

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

कम से कम मैं तर्क दूंगा कि आपके पास ऐसे दो बफ़र्स होने चाहिए। सबसे पहले अपने प्रोजेक्शन मैट्रिक्स, कैमरा मैट्रिक्स, कॉन्टेनेटेड कैमरा-प्रोजेक्शन मैट्रिक्स, व्यूपोर्ट इंफॉर्मेशन, फ्रस्ट्रम डिटेल्स और मैट्रिक्स इनवर्स को स्टोर करना चाहिए। आपको केवल प्रति दृश्य एक बार इस बफर को अपडेट करना होगा।

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

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

ध्यान दें कि आपको सामान्य बफ़र्स का उपयोग करने के लिए GL के मध्यम से अद्यतित संस्करण की आवश्यकता है (3.1 या एक एक्सटेंशन; आम तौर पर आज कुछ पुराने लेकिन अभी भी सेवा लैपटॉप पर छोड़कर) और आपको होने के लिए एक हालिया संस्करण की आवश्यकता है समान बफ़र्स को shader कोड के अंदर से विशिष्ट बाइंडिंग स्थानों में बाँधने में सक्षम (4.2; अभी भी असामान्य है, लेकिन बेहतर हो रहा है) अन्यथा आपको अपने CPU-साइड कोड में और अधिक काम करना होगा ताकि चीजों को सेट किया जा सके (आपके CPU कोड को सही बाइंडिंग जानने की आवश्यकता है वैसे भी अंक, तो यह एक गंभीर मुद्दे की तुलना में एक एपीआई गंध है)। OpenGL | ES ने 3.0 तक एकसमान बफ़र्स नहीं जोड़े, जो कि अभी भी सबसे लोकप्रिय मोबाइल प्लेटफार्मों पर असमर्थित है, दुर्भाग्य से।

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

देखें GLSL Inteface ब्लाकों और वर्दी बफर वस्तुओं


मुझे पता था कि उनका बनाया हुआ तरीका होगा। धन्यवाद!
Lerp

4

ऐसा करने का सबसे सरल तरीका यह है कि आप अपने शेड्स के बीच एकसमान नामों का मानकीकरण करें और ड्रा करने से ठीक पहले सभी डेटा भेजें। ओवरहेड पागल नहीं है, लेकिन आप इसे बाद में हमेशा कम-अपडेटेड वर्दी नहीं भेज सकते हैं।

जिस तरह से मैं अपने खेल में ऐसा करता हूं कि मेरे पास एक अमूर्त Materialवर्ग है। सामग्री खेल और shaders के बीच एक पुल के रूप में कार्य करती है। प्रत्येक Materialमें एक Shaderऔर विभिन्न गुण होते हैं जिन्हें टेक्सचर सहित सेट किया जा सकता है। जब किसी वस्तु को खींचने का समय आता है, तो Materialवह बाध्य होती है। Bindविधि एक है GraphicsStateमैट्रिक्स, रोशनी, आदि - पैरामीटर सभी शामिल है कि मौजूदा ग्राफिक्स राज्य Bindका उपयोग कर जो भी इसे से की जरूरत है, विधि बांध शेडर और बनावट और सेट सभी वर्दी GraphicsState

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