2013-04-04 3 views
21

मैं ओपन में एक शीर्ष बफर सेट कर रहा हूं, इस तरह:ओपनजीएल वर्टेक्स बफर को संशोधित करने का सही तरीका क्या है?

int vboVertexHandle = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_DYNAMIC_DRAW); 

बाद में, अगर मैं जोड़ सकते हैं या कोने निकालना चाहते हैं "vertexData" करने के लिए, यह करने के लिए उचित तरीके क्या है? क्या यह भी संभव है? मुझे लगता है कि मैं GPU को फिर से भेजने के बिना सीधे सरणी को संशोधित नहीं कर सकता।

अगर मैं vertexData सरणी संशोधित करते हैं तो फिर इस फोन:

glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_DYNAMIC_DRAW); 

... कि मेरे नए डेटा के साथ पुराने बफर के ऊपर लिख देगा? या क्या मुझे पुराना भी हटाना है? क्या कोई बेहतर तरीका है?

उत्तर

23

किसी भी ओपनजीएल बफर ऑब्जेक्ट का आकार सेट होता है जब आप glBufferData पर कॉल करते हैं। यही है, ओपनजीएल glBufferData (जो ओपी में सूचीबद्ध नहीं है) के दूसरे तर्क में निर्दिष्ट स्मृति की मात्रा आवंटित करेगा। वास्तव में, यदि आप कॉल करते हैं, उदाहरण के लिए glBufferData(GL_ARRAY_BUFFER, bufferSize, NULL, GL_DYNAMIC_DRAW); ओपनजीएल अनियमित डेटा बाइट्स का बफर बनाएगा।

आप (बफर के आकार तक के) का उपयोग कर डेटा के किसी भी राशि लोड कर सकते हैं glBufferSubData, glMapBuffer, या डेटा पारित करने के लिए अन्य दिनचर्या के किसी भी। बफर का आकार बदलने का एकमात्र तरीका glBufferData को उसी बफर आईडी के लिए एक नए आकार के साथ कॉल करना है (मान glGenBuffers से लौटाया गया है)।

यह कहा गया है कि आप हमेशा बफर में डेटा के सबसेट का उपयोग कर सकते हैं (जो कि वर्टिस को हटाने के समान होगा), और यदि आप glDrawElements का उपयोग करके प्रस्तुत करते हैं, तो आप बफर में तत्वों को यादृच्छिक रूप से एक्सेस कर सकते हैं। एक बफर में कोष्ठक जोड़ने के लिए एक बड़ा बफर आवंटित करने की आवश्यकता होगी, और फिर आपको बफर में सभी डेटा को फिर से लोड करना होगा।

+0

क्या आपके पहले पैराग्राफ के अंत में "अनियमित डेटा" कहने का मतलब नहीं था? – Ancurio

+0

@ एंकुरियो वास्तव में मैंने किया था। सुधारों के लिए धन्यवाद। – radical7

4

http://www.opengl.org/wiki/GLAPI/glBufferData

glBufferData वर्तमान में लक्षित करने के लिए बाध्य बफर वस्तु के लिए एक नया डेटा संग्रह बनाता है। कोई भी पूर्व-मौजूदा डेटा स्टोर हटा दिया गया है।

इस डेटा "पुनः निर्दिष्ट करें" होगा glBufferData के लिए एक कॉल बताते हैं, बफर एक नया आकार होगा। सभी पुराने डेटा खो जाएंगे। यदि आप बफर के केवल एक हिस्से को लिखना चाहते हैं, तो इसके बजाय glBufferSubData का उपयोग करें।

http://www.opengl.org/wiki/GLAPI/glBufferSubData

संपादित करें: glBufferSubData केवल यदि आप डेटा को बदलना चाहते है, इसके बजाय बफर का आकार बदलने के लिए, आपको glBufferData पर कॉल करना होगा।

इसके अलावा, आपको पहले बफर को नष्ट करने और एक नया उत्पन्न करने की आवश्यकता नहीं है। याद रखें कि ग्लूइंट ओपनजीएल के लिए केवल 'पॉइंटर' है। यह वास्तविक भंडारण नहीं है, इस प्रकार यह 'पॉइंटर' का पुन: उपयोग करने के लिए बिल्कुल ठीक है (यदि आपने अभी तक इसे हटाया नहीं है)।

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