2013-01-10 12 views
19

मैं ओपनजीएल (ओपनटीके के माध्यम से सी # के माध्यम से) का उपयोग करके थोड़ा ग्राफिक्स इंजन लिख रहा हूं।ओपनजीएल, वीएओ और एकाधिक बफर

वर्टेक्स विशेषताओं को परिभाषित करने के लिए, मेरे पास VertexDeclaration क्लास है जो VertexElement संरचनाओं की एक सरणी है जो glEnableVertexAttribArray/glVertexAttribPointer कॉल पर मैप किए गए हैं।

इसके अलावा, एकाधिक वर्टेक्स धाराओं का समर्थन करने के लिए, मेरे पास एक विशेष संरचना है जिसमें वर्टेक्स बफर, वर्टेक्स घोषणा, वर्टेक्स ऑफ़सेट और आवृत्ति आवृत्ति (जैसे एक्सएनए की वर्टेक्सबफर बाइंडिंग संरचना) है।

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

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

क्या यह वीएओ का सही उपयोग है?

उत्तर

34

क्या यह वीएओ का सही उपयोग है?

नहीं ।

glVertexAttribPointeruses the buffer object that was bound to GL_ARRAY_BUFFERat the moment the function was called। तो अगर आप ऐसा नहीं कर सकते:

glVertexAttribPointer(...); 
glBindBuffer(GL_ARRAY_BUFFER, bufferObject); 
glDrawArrays(...); 

यह होगा नहीं उपयोग bufferObject; यह GL_ARRAY_BUFFER पर बाध्य था जो glVertexAttribPointer मूल रूप से बुलाया गया था।

वीएओ इस राज्य को पकड़ते हैं। तो वीएओ प्रत्येक वर्टेक्स विशेषता के लिए, जो भी बफर ऑब्जेक्ट GL_ARRAY_BUFFER पर कॉल किया गया था, स्टोर करेगा। यह आप इस तरह काम करने के लिए अनुमति देता है:

glBindVertexArray(VAO); 
glBindBuffer(GL_ARRAY_BUFFER, buffer1); 
glVertexAttribPointer(0, ...); 
glVertexAttribPointer(1, ...); 
glBindBuffer(GL_ARRAY_BUFFER, buffer2); 
glVertexAttribPointer(2, ...); 

गुण 0 और 1 buffer1 से आएगा, और 2 विशेषता buffer2 से आएगा। वीएओ अब उस राज्य को कैप्चर करता है। रेंडर करने के लिए, तुम बस ऐसा करते हैं: संक्षेप में आप बदलना जहां एक विशेषता के भंडारण ओपन में से आता है चाहते हैं, तो

glBindVertexArray(VAO); 
glDraw*(); 

,, आप भी परिवर्तन करना होगा यह प्रारूप है। भले ही यह एक ही प्रारूप है, आपको फिर से glVertexAttribPointer पर कॉल करना होगा।

: इस चर्चा हो जाती है कि आप नए ARB_vertex_attrib_binding का उपयोग कर रहे हैं नहीं। या, जैसा कि यह अन्यथा ज्ञात है, "Exactly how Direct3D does vertex attribute binding." यदि आप इस एक्सटेंशन को प्रदान करने वाले कार्यान्वयन का उपयोग करते हैं, तो आप प्रभावी रूप से जो कर रहे हैं उसके बारे में आप कर सकते हैं, क्योंकि विशेषता प्रारूप बफर ऑब्जेक्ट के संग्रहण से बंधे नहीं है। इसके अलावा, glVertexAttribPointer का उत्पीड़ित तर्क चला गया है।

आम तौर पर, ओपनजीएल दुनिया में इसे हल करने के तरीके को उसी बफर ऑब्जेक्ट में जितनी संभव हो उतनी चीजें डालना है। उसमें विफल होने पर, प्रत्येक ऑब्जेक्ट के लिए केवल एक वीएओ का उपयोग करें।

+0

इस महान उत्तर के लिए धन्यवाद।फिर 'glBufferData' कदम कहां कार्रवाई में आता है? 'GlvertexAttribPointer' का उपयोग करने से पहले आपको डेटा को पहले बफर नहीं करना है? क्षमा करें मैं ओपनजीएल के लिए बहुत नया हूँ –

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