2012-04-03 6 views
7

को अमान्य कर मैं निश्चित था कि अगर आप glBindBuffer() के माध्यम से एक बफर के लिए बाध्य, आप सुरक्षित रूप से, यह मान सकते हैं कि यह बाध्य रहता है जब तक लक्ष्य glBindBuffer() के लिए एक और कॉल के माध्यम से पलटाव है। तुरंत एक ओपन 3.2 आरंभ के बादओपन 3: glBindVertexArray GL_ELEMENT_ARRAY_BUFFER

GLuint buff; 
glGenBuffers(1, &buff); 
std::cout << "Buffer is " << buff << "\n"; 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buff); 
GLuint vao; 
glGenVertexArrays(1, &vao); 

GLint bound_buff; 
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff); 
std::cout << "Bound before glBindVertexArray: " << bound_buff << "\n"; 

glBindVertexArray(vao);  
    // ^- an implicit glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); ? 

glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff); 
std::cout << "Bound after glBindVertexArray: " << bound_buff << "\n"; 

मैं इस कोड को चलाने: मैं इसलिए काफी हैरान जब मुझे पता चला कि फोन करने glBindVertexArray() 0.

यहाँ कम से कम सी ++ नमूना कोड के लिए बफर GL_ELEMENT_ARRAY लक्ष्य करने के लिए बाध्य सेट था

Buffer is 1 
Bound before glBindVertexArray: 1 
Bound after glBindVertexArray: 0 

GL_ARRAY_BUFFER दूसरी ओर नहीं कॉल करके बदला है: डिवाइस संदर्भ और निम्न उत्पादन मिलता है। मैंने glBindVertexArray के लिए ओपनजीएल 3.2 स्पेक (2.10) की जांच की और उस अप्रत्याशित दुष्प्रभाव का कोई उल्लेख नहीं मिला।

  1. क्या यह व्यवहार स्पेक के अनुरूप है?
  2. यदि हां, तो कॉल से glBindVertexArray पर अन्य दुष्प्रभावों की अपेक्षा की जा सकती है?
  3. इसके पीछे तर्क क्या है?

मैंने इसे 296.10 WHQL ड्राइवर के साथ Win XPx64 मशीन पर एक एनवीडिया कार्ड पर परीक्षण किया। एक एनवीडिया जीटी 330 एम के साथ ओएस एक्स शेर पर एक त्वरित परीक्षण एक ही परिणाम दिया।

+0

मुझे लगता है कि एक वीएओ बाध्यकारी तत्व और vertex सरणी बफर को बाध्यकारी है। वीएओ के लिए यही है। यदि आप एक वीएओ बांधते हैं और फिर एक इंडेक्स और वर्टेक्स बफर बांधते हैं, तो जब भी आप वीएओ को बाध्य करते हैं तो उन बफर को तत्काल बाध्य किया जाता है। इसलिए ऊपर दिए गए वीएओ को बाध्यकारी रूप से अनुमानित रूप से तत्व और वर्टेक्स सरणी को शून्य पर सेट कर दिया गया है क्योंकि इन्हें आपके द्वारा वीएओ ऑब्जेक्ट में शामिल नहीं किया गया है। वह समझ में आया था? :-) – Robinson

+0

लेकिन यह केवल GL_ELEMENT_ARRAY_BUFFER क्यों बदलता है, न कि GL_ARRAY_BUFFER? – ComicSansMS

+0

क्योंकि सरणी बफर वर्टेक्स बफर है (कम से कम विभिन्न glEnableVertexAttribArray और glVertexAttribPointer इसके साथ आपके कॉल को कॉल करता है), और इसमें उस स्थिति के हिस्से के रूप में तत्व बफर शामिल है। – Robinson

उत्तर

15

Vertex Array Objects वर्टेक्स डेटा प्रस्तुत करने के लिए आवश्यक सभी राज्य * को समाहित करता है। इसलिए, उन्हें गुणों (glVertexAttribPointer के माध्यम से), GL_ELEMENT_ARRAY_BUFFER (glDrawElement* कॉल के लिए आवश्यक) के साथ जुड़े बफर को अवशोषित करना होगा, और आगे भी।

हालांकि, मुझे अभी भी इस तथ्य से थोड़ा परेशान महसूस होता है कि मुझे दस्तावेज़ों में इस दुष्प्रभाव का कोई उल्लेख नहीं मिला।

विनिर्देश स्पष्ट रूप से यह समझाता है, हालांकि यह समझने की आवश्यकता है कि कल्पना कैसे काम करती है।

ओपनजीएल राज्य का एक संग्रह है, जिसका अर्थ है कि सभी ओपनजीएल फ़ंक्शंस (जो वास्तव में कुछ प्रस्तुत करते हैं) को छोड़कर ओपनजीएल राज्य को संशोधित करता है। जब आप glVertexAttribPointer पर कॉल करते हैं, तो यह फ़ंक्शन अवधारणात्मक रूप से आंतरिक ओपनजीएल राज्य के कुछ टुकड़े को संशोधित करता है।

OpenGL objects परिभाषित किया गया है कि ओपनजीएल राज्य के कौन से टुकड़े वे encapsulate। इस प्रकार, यदि कोई फ़ंक्शन किसी ऑब्जेक्ट द्वारा encapsulated राज्य को संशोधित करता है, तो वह फ़ंक्शन ऑब्जेक्ट को स्वयं संशोधित करता है। किसी ऑब्जेक्ट को बाध्य करने का अर्थ राज्य के मौजूदा टुकड़ों को प्रतिस्थापित करना है कि वे उस ऑब्जेक्ट की वर्तमान स्थिति के साथ समाहित होते हैं।

विनिर्देश वीएओ को परिभाषित करता है कि वे किस राज्य को समाहित करते हैं। यह मूल रूप से ओपनजीएल राज्य तालिकाओं में से एक पर इंगित करता है और कहता है, "वीएओ ये सब हैं।"

ओपन 3.3 विनिर्देश, धारा 2: इस कार्यक्षमता के मुख्य 3.x संस्करण वास्तव में यह थोड़ा और अधिक स्पष्ट (समान व्यवहार, तो तत्संबंधी थोड़ा अलग व्याख्या) बनाने के लिए राज्य टेबल संशोधित करता है।10:

परिणामी वर्टेक्स सरणी ऑब्जेक्ट एक नया राज्य वेक्टर है, जिसमें तालिका 6.4 और 6.5 में सूचीबद्ध सभी राज्य मान शामिल हैं।

मैं तालिका 6.4 और 6.5 को पुनर्मुद्रण नहीं कर रहा हूं; आप उन्हें स्वयं देख सकते हैं। लेकिन वे स्पष्ट रूप से GL_ELEMENT_ARRAY_BUFFER_BINDING और विभिन्न GL_VERTEX_ATTRIB_ARRAY_BUFFER_BIDNING (जो बफर ऑब्जेक्ट्स हैं) शामिल हैं।

* नोट: वीएओ में glVertexAttrib फ़ंक्शंस द्वारा राज्य सेट नहीं है। यदि कोई विशेषता सरणी सक्षम नहीं है तो ये प्रतिपादन को प्रभावित कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^