2014-04-15 9 views
11

मैं ओपनजीएल सीख रहा हूं और ध्यान दिया कि मेरे पास इनपुट गुणों से निपटने के दौरान glGetAttribLocation() या glBindAttribLocation() का उपयोग करने का विकल्प है, लेकिन वर्दी के लिए, मुझे glGetUniformLocation() का उपयोग करना होगा। क्या एपीआई में glBindUniformLocation() शामिल करने के लिए कोई तकनीकी कारण नहीं है?वर्दी चर के लिए समकक्ष कोई glbindAttribLocation() क्यों नहीं है?

उत्तर

6

स्टार्टर्स के लिए, वर्दी के मान को सेट करने के लिए glUniform* (...) जैसे फ़ंक्शन को कॉल करने के अलावा, आप उनके साथ कोई अन्य चीज नहीं कर सकते हैं। जीएलएसएल से पहले वर्दी मौजूद नहीं थी।

ओपनजीएल में विशेषता स्थान GL_ARB_vertex_program असेंबली भाषा पर वापस स्थान (जहां अट्रीब्स के नामों के बजाय संख्याएं थीं)। वास्तव में, जब यह पहली जीएल में जोड़ा गया था, उन सूचकांक पारंपरिक अचल समारोह संकेत के लिए उपनामित (जैसे == glVertexPointer (...), == glNormalPointer (...), == glColorPointer (...)) ताकि शीर्ष कार्यक्रमों सका आसानी से मौजूदा अनुप्रयोगों में गिरा दिया जाना चाहिए। जीएलएसएल ने एपीआई के दो हिस्सों का पुन: उपयोग किया कि असेंबली भाषा एक्सटेंशन अग्रणी (यह बहुत होता है)।

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

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

यह व्यवहार वर्दी के लिए बहुत महत्वपूर्ण नहीं है, लेकिन फिर भी, वे Uniform Buffers के रूप में इसी तरह की सुविधा है। आप एक साझा करने योग्य स्थान (आपके चयन के) में वर्दी बफर बांध सकते हैं और अपने सभी जीएलएसएल कार्यक्रमों में अपने वर्दी ब्लॉक में सभी मानों का दोबारा उपयोग कर सकते हैं। वास्तव में, यह कार्यक्षमता मूल रूप से नाम के साथ विस्तार के रूप में पेश की गई थी: GL_EXT_bindable_uniform

संबंधित मुद्दे