2012-08-21 24 views
8

संभव डुप्लिकेट:
Explicit vs Automatic attribute location binding for OpenGL shadersमुझे glbindAttribLocation का उपयोग क्यों करना चाहिए?

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

मुझे समझ नहीं है कि मैं जो शेयर जिम्मेदार बताते हैं इस समझ में आता है, के बाद से मैं कार्यक्रमों के बीच स्विच कर सकते हैं और उन विशेषताओं को रीसेट करने की जरूरत नहीं बहुल प्रोग्राम है। हालांकि, गुण जो बांटा नहीं जाता है या यदि मेरे कार्यक्रमों सिर्फ इस तरह के साझा करने का उपयोग नहीं करते, मैं देख नहीं है कि यह स्पष्ट रूप से सूचकांक बाध्य करने के लिए आवश्यक है।

+0

टीएल; डॉ कोई बड़ा सौदा नहीं। यह फ़ंक्शन _might_ आसान है लेकिन यह एक बड़ी बात नहीं है। मैं नहीं देख सकता कि यह एक * अनुशंसित अभ्यास *, स्रोत कैसे हो सकता है? – Kos

+2

आपने पहले से ही इसका उत्तर दिया है। तो आप प्रोग्राम को दो पूर्वनिर्धारित विशेषताओं को साझा कर सकते हैं और आप प्रोग्राम स्विच कर सकते हैं या विभिन्न वस्तुओं आदि के लिए भी उनका उपयोग कर सकते हैं। अभ्यास में मुझे यह एक बड़ा फायदा मिलता है। – Invalid

+0

मैंने अपने ग्राफिक्स इंजन में 'glbindAttribLocation' का उपयोग करके परेशान नहीं किया, जिसने लिनक्स पर अच्छी तरह से काम किया। जब मैंने खिड़कियों पर पोर्ट किया, तो यह मेरे मानदंडों को चरम के रूप में उपयोग कर रहा था - मुझे इसे 'glbindAttribLocation' के माध्यम से चर के क्रम में स्पष्ट रूप से बताना था ... – Jarrett

उत्तर

18

सबसे पहले मुझे नहीं लगता कि यह glGetAttribLocation के बजाय glBindAttribLocation​ के माध्यम से स्पष्ट बाध्यकारी का उपयोग करने की सामान्य सिफारिश है। कहा जा रहा है, इन मुख्य कारणों में मैं glGetAttribLocation उपयोग बंद कर दिया हैं:

सबसे पहले, यह अनावश्यक भूमि के ऊपर हो सकता है। यह सब अच्छा और अच्छा लगता है कि आप संख्याओं के बजाय एक पठनीय नामों का उपयोग कर सकते हैं। बनाम 'ओह ठीक है, texture_coordinate विशेषता' 'क्या बिल्ली विशेषता 7': मैं पहली बार व्याख्या करेंगे संभव भूमि के ऊपर हो सकता है और उसके बाद क्यों कि आखिरी हिस्सा भी मतलब नहीं है।

आप विशेषता स्थान अक्सर, glGetAttribLocation बुला गैर नगण्य हो सकता है, ड्राइवर पर निर्भर करता है की भूमि के ऊपर की जरूरत है। तो सामान्य मामले को संभालने के लिए आपको कैशिंग-सिस्टम बनाना होगा। बढ़िया, संख्याओं के बजाय नामों के साथ मेरी आसान और पठनीय विधि जाती है, मुझे बस बहुत सारे गैर-तुच्छ रैपर कोड लिखना पड़ा। इससे भी बदतर, आपको वास्तव में ध्यान रखना चाहिए कि जब प्रोग्राम अमान्य हो जाता है तो आप कैश को नष्ट कर देते हैं, यह संभावना है कि आप यह गलत करेंगे और बग के साथ समाप्त हो जाएंगे। तो हम 'अच्छे पठनीय नाम' से 'भयानक छोटी गाड़ी' में गए।

इससे भी अधिक, 'अच्छा पठनीय नाम' तर्क त्रुटिपूर्ण है। आप पूरी तरह से की तरह कुछ कर सकते हैं शेडर अपने आप में निर्धारित स्थानों के लिए निम्नलिखित:

const GLint vertex_loc_att = 0; 
const GLint texture_coord_att = 1; 
... 

या आप भी इस तरह की एक साहचर्य कंटेनर का उपयोग कर सकते हैं:

attribute_locations["vertex_location"] = 0; 
attribute_locations["texture_coordinate"] = 1; 
... 

यह एक आप भी glBindAttribLocation साथ गठजोड़ कर सकते हैं, बस लिंक करने से पहले ऐसा करते हैं:

foreach name, location in attribute_locations 
{ 
    glBindAttribLocation(program_id, location, name); 
} 

फिर भी बहुत पठनीय, कोई गतिशील कैश आवश्यक हो, तो बस कुछ स्थैतिक चर भी मिल सकता है कि अनुकूलित अनुकूलित

फिर, आप इसे स्वयं कहते हैं: यह स्पष्ट रूप से कई प्रोग्रामों का उपयोग करते समय फायदे हैं, मैं इसे दोहराना नहीं चाहूंगा, क्योंकि कोस explained that one in detail already। मैं सिर्फ आपके तर्कों में से एक का उत्तर दूंगा:

विशेषताएँ जिन्हें साझा करने की आवश्यकता नहीं है: इसका तात्पर्य है कि ऐसे गुण भी हैं जिन्हें साझा करने की आवश्यकता है, जिसके लिए यह एक बड़ा फायदा है कि आप निश्चित स्थानों का उपयोग करते हैं। आप एक आवेदन में दो स्थान प्रबंधन दृष्टिकोण क्यों मिश्रण करेंगे? अपने आप को रखरखाव सिरदर्द से रखें और स्पष्ट रूप से पूर्वनिर्धारित स्थानों के साथ चिपके रहें क्योंकि आपको साझा विशेषताओं के लिए उनकी आवश्यकता है।

+4

क्या यह समझ में आता है कि कोई भी' glbindUniformLocation ' '? मैं पूछ रहा हूं क्योंकि आपका तर्क भी इस पर लागू होता है, लेकिन ऐसा फ़ंक्शन मानक में नहीं है। –

+1

glbindUniformLocation कार्यक्षमता को शेडर में लेआउट कथन के माध्यम से 4.3 में जोड़ा गया था: http://www.opengl.org/wiki/Uniform_(GLSL)#Explicit_uniform_location –

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