का प्रयोग करें वर्दी बफ़र्स (यानी निरंतर बफ़र्स D3D शब्दावली में)।
जब तक आपके सभी शेड्स इस तरह के बफर के लेआउट और बाइंडिंग पॉइंट पर सहमत हो जाते हैं तब तक अपडेट करना एक हवा बन जाता है। मॉडल को शेड्स के बारे में कुछ भी जानने की कोई आवश्यकता नहीं है। उन्हें अपने निरंतर बफर में केवल मॉडल-व्यू मैट्रिक्स को अपडेट करने की आवश्यकता होती है और रेंडरिंग पाइपलाइन इसका स्वचालित रूप से उपयोग करेगी।
कम से कम मैं तर्क दूंगा कि आपके पास ऐसे दो बफ़र्स होने चाहिए। सबसे पहले अपने प्रोजेक्शन मैट्रिक्स, कैमरा मैट्रिक्स, कॉन्टेनेटेड कैमरा-प्रोजेक्शन मैट्रिक्स, व्यूपोर्ट इंफॉर्मेशन, फ्रस्ट्रम डिटेल्स और मैट्रिक्स इनवर्स को स्टोर करना चाहिए। आपको केवल प्रति दृश्य एक बार इस बफर को अपडेट करना होगा।
फिर प्रत्येक मॉडल को अपने मॉडल-व्यू मैट्रिक्स, सामान्य मैट्रिक्स, व्युत्क्रम और भौतिक गुणों को संग्रहीत करने के लिए एक और बफर दें। यह प्रत्येक मॉडल के लिए एक बार अपडेट किया जाता है और इसे एक अलग अपडेट पास (यदि / जब उपयुक्त हो) में किया जा सकता है। यदि आप कई वस्तुओं के बीच सामग्री साझा करने की क्षमता रखते हैं, तो सामग्री की जानकारी को तीसरे सामग्री-विशिष्ट बफर में स्थानांतरित किया जा सकता है।
फ़ॉरवर्ड-शेडिंग सेटअप में सभी बत्तियों को दूसरे बफ़र में डालने के लिए कुछ समझ में आता है और आस्थगित-शेडिंग में भी इसी तरह से लाइट पास के लिए प्रति-लाइट बफ़र (मॉडल / मटेरियल बफर के स्थान पर प्रयुक्त बफ़र) का उपयोग करने की समझ में आता है। ज्यामिति पास)।
ध्यान दें कि आपको सामान्य बफ़र्स का उपयोग करने के लिए GL के मध्यम से अद्यतित संस्करण की आवश्यकता है (3.1 या एक एक्सटेंशन; आम तौर पर आज कुछ पुराने लेकिन अभी भी सेवा लैपटॉप पर छोड़कर) और आपको होने के लिए एक हालिया संस्करण की आवश्यकता है समान बफ़र्स को shader कोड के अंदर से विशिष्ट बाइंडिंग स्थानों में बाँधने में सक्षम (4.2; अभी भी असामान्य है, लेकिन बेहतर हो रहा है) अन्यथा आपको अपने CPU-साइड कोड में और अधिक काम करना होगा ताकि चीजों को सेट किया जा सके (आपके CPU कोड को सही बाइंडिंग जानने की आवश्यकता है वैसे भी अंक, तो यह एक गंभीर मुद्दे की तुलना में एक एपीआई गंध है)। OpenGL | ES ने 3.0 तक एकसमान बफ़र्स नहीं जोड़े, जो कि अभी भी सबसे लोकप्रिय मोबाइल प्लेटफार्मों पर असमर्थित है, दुर्भाग्य से।
यदि बफ़र्स एक विकल्प नहीं हैं, तो आपको सक्रिय shader के लिए सूचकांक स्थानों को संग्रहीत करने के लिए कुछ वैश्विक स्थान की आवश्यकता होगी। आप glGetUniformLocation
अपने शेडर को लोड करने के बाद प्रसिद्ध नामों (जैसे ModelViewMatrix
या पसंद) के सूचकांकों को खोजने के लिए उपयोग कर सकते हैं , फिर इन सूचकांकों को संग्रहीत कर सकते हैं। आपका रेंडर बंधे हुए शेपर को देखने, इंडेक्स को खोजने और ठीक से कॉल करने के लिए रैपर फ़ंक्शन को MODEL_VIEW
पास किए गए एनम वैल्यूज़ को मैप कर सकता है। यदि आप इसे अच्छी तरह से लिपटे पाते हैं तो व्यक्तिगत रूप से प्रत्येक वर्दी को सेट करने की आवश्यकता के अलावा बफ़र्स से क्लाइंट कोड के उपयोग में यह कोई विशेष परिवर्तन नहीं है।SetUniform
glUniform
देखें GLSL Inteface ब्लाकों और वर्दी बफर वस्तुओं ।