को अमान्य कर मैं निश्चित था कि अगर आप 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) की जांच की और उस अप्रत्याशित दुष्प्रभाव का कोई उल्लेख नहीं मिला।
- क्या यह व्यवहार स्पेक के अनुरूप है?
- यदि हां, तो कॉल से
glBindVertexArray
पर अन्य दुष्प्रभावों की अपेक्षा की जा सकती है? - इसके पीछे तर्क क्या है?
मैंने इसे 296.10 WHQL ड्राइवर के साथ Win XPx64 मशीन पर एक एनवीडिया कार्ड पर परीक्षण किया। एक एनवीडिया जीटी 330 एम के साथ ओएस एक्स शेर पर एक त्वरित परीक्षण एक ही परिणाम दिया।
मुझे लगता है कि एक वीएओ बाध्यकारी तत्व और vertex सरणी बफर को बाध्यकारी है। वीएओ के लिए यही है। यदि आप एक वीएओ बांधते हैं और फिर एक इंडेक्स और वर्टेक्स बफर बांधते हैं, तो जब भी आप वीएओ को बाध्य करते हैं तो उन बफर को तत्काल बाध्य किया जाता है। इसलिए ऊपर दिए गए वीएओ को बाध्यकारी रूप से अनुमानित रूप से तत्व और वर्टेक्स सरणी को शून्य पर सेट कर दिया गया है क्योंकि इन्हें आपके द्वारा वीएओ ऑब्जेक्ट में शामिल नहीं किया गया है। वह समझ में आया था? :-) – Robinson
लेकिन यह केवल GL_ELEMENT_ARRAY_BUFFER क्यों बदलता है, न कि GL_ARRAY_BUFFER? – ComicSansMS
क्योंकि सरणी बफर वर्टेक्स बफर है (कम से कम विभिन्न glEnableVertexAttribArray और glVertexAttribPointer इसके साथ आपके कॉल को कॉल करता है), और इसमें उस स्थिति के हिस्से के रूप में तत्व बफर शामिल है। – Robinson