मुझे स्पष्ट स्थान परिभाषा पसंद करने का एक अच्छा कारण पता है ।
इस बात पर विचार करें कि आप वर्टेक्स ऐरे ऑब्जेक्ट्स में अपना ज्यामिति डेटा रखते हैं । किसी दिए गए ऑब्जेक्ट के लिए, आप इस तरह से एक वीएओ बनाते हैं, जो सूचकांक उदाहरण के लिए मेल खाते हैं:
- सूचकांक 0 : स्थिति,
- सूचकांक 1 : मानदंड,
- सूचकांक 2 : टेक्सकोर्ड्स
अब विचार करें कि आप एक वस्तु को दो अलग-अलग शेड्स के साथ खींचना चाहते हैं । एक shader को इनपुट के रूप में स्थिति और सामान्य डेटा की आवश्यकता होती है , अन्य - स्थिति और बनावट के कोर्डर्स ।
यदि आप उन शेड्स को संकलित करते हैं, तो आप देखेंगे कि पहला शेडर विशेषता सूचकांक 0 पर स्थितियां और 1 पर मानदंडों की अपेक्षा करेगा। अन्य 1 पर स्थिति की उम्मीद करेंगे, लेकिन बनावट 1 पर।
उद्धरण https://www.opengl.org/wiki/Vertex_Shader :
स्वचालित असाइनमेंट
यदि पहले के दो तरीकों में से कोई भी विशेषता इंडेक्स में इनपुट असाइन नहीं करता है, तो प्रोग्राम के लिंक होने पर इंडेक्स स्वचालित रूप से OpenGL द्वारा असाइन किया जाता है। सौंपे गए सूचकांक पूरी तरह से मनमाना है और अलग-अलग कार्यक्रमों के लिए अलग-अलग हो सकते हैं जो जुड़े हुए हैं, भले ही वे एक ही वर्टेक्स शेडर कोड का उपयोग करते हों।
इसका मतलब है कि आप अपने VAO को दोनों शेड्स के साथ उपयोग नहीं कर पाएंगे। एक VAO प्रति होने के बजाय, कहें, ऑब्जेक्ट, आपको चाहिए - सबसे खराब स्थिति में - प्रति shader प्रति ऑब्जेक्ट का एक अलग VAO ।
अपने स्वयं के विशेषता नंबरिंग कन्वेंशन का उपयोग करने के लिए शेड्स को मजबूर glBindAttribLocationकरने से इस समस्या को आसानी से हल किया जा सकता है - आपको केवल इतना करना है कि विशेषताओं और उनके एस्टेब्लिशड आईडी के बीच एक सुसंगत संबंध बनाए रखें, और लिंक करते समय शेडर्स को उपयोग करने के लिए बाध्य करें।
(यदि आप अलग-अलग VAO का उपयोग नहीं करते हैं, तो यह वास्तव में एक बड़ा मुद्दा नहीं है, लेकिन फिर भी आपका कोड स्पष्ट हो सकता है।)
Btw:
OpenGL शेडर प्रोग्राम के लिए विशेषता स्थान सेट करते समय, आपको दो विकल्पों का सामना करना पड़ता है
OpenGL / GLSL 3.3 में तीसरा विकल्प है: सीधे shader कोड में स्थान निर्दिष्ट करें । यह इस तरह दिख रहा है:
layout(location=0) in vec4 position;
लेकिन यह GLSL ES shader भाषा में मौजूद नहीं है।
glBindAttribLocationअपने ग्राफिक्स इंजन का उपयोग करने में परेशान नहीं किया , जो कि लिनक्स पर अच्छी तरह से काम करता था। जब मैंने खिड़कियों पर पोर्ट किया, तो यह मेरे मानदंड को कोने के रूप में उपयोग कर रहा था - मुझे इसे स्पष्ट रूप से अपनी छाया में चर के आदेश के माध्यमglBindAttribLocationसे इसे काम करने के लिए बताना था ...