2011-01-31 20 views
13

मुझे एक बफर खींचना है जिसमें दो हजार शिखर हैं। मैं डेटा स्टोर करने के लिए एक vbo का उपयोग कर रहा हूँ।ओपनजीएल वीबीओ डेटा अपडेट करने

मुझे पता है कि मुझे कई बार वीबीओ अपडेट करना होगा - लेकिन केवल एक समय में छोटे भागों में।

तो मैं सोच रहा हूँ क्या ऐसा करने के लिए सबसे अच्छा तरीका है:

  1. स्प्लिट VBO ऊपर छोटे VBOs में (जो कि 300 verts तरह पकड़) और फिर 1 कॉल के साथ व्यक्तिगत VBOs अद्यतन?
  2. एक बड़ा वीबीओ और glBufferSubData() कॉल का उपयोग करें?
  3. glMapBuffer() और एक बड़ा वीबीओ का उपयोग करें?

उत्तर

2
  1. एक अच्छा विचार सी नहीं लगती: यह आपको कई कॉल में यह आकर्षित करने के लिए मजबूर करता प्रत्येक ड्रा कॉल के बीच बाध्य बफर बदलते समय।
  2. यदि आपका बफर बड़ा है तो चाल चल सकता है।
  3. पूरा बफर निश्चित रूप से GPU पर अपलोड किया जाएगा। यह निश्चित रूप से एक glbufferData के रूप में कुशल होगा, लेकिन आप इसे असंकालिक रूप से कर सकते हैं।

यदि ऐसा लगता है कि आपका बफर छोटा है तो glBufferData या glMapBuffer बेहतर समाधान है। 100000 * sizeof(float) * 3 ~= 1MB। इसके साथ कोई समस्या नहीं होनी चाहिए।

+0

साइड नोट: मुझे पहले से ही पता है कि मुझे इसे कई कॉलों में आकर्षित करना है - चाहे मैं कई वीबीओ का उपयोग करता हूं या नहीं। मुझे यह भी पता है कि मैं केवल एक समय में शिखर का हिस्सा खींचागा। क्या बाध्य वीबीओ बफर बदलने के लिए बहुत सारे ओवरहेड हैं? इसके अलावा, नक्शा बफर बफरडाटा से धीमा है? – Pubby

+0

मैपबफर का लाभ यह है कि आप अपने डेटा को बफर के अंदर कॉपी कर सकते हैं जबकि जीएल कुछ और कर रहा है। दूसरी तरफ, बफर मैपिंग का असली पर्फ वास्तव में कार्यान्वयन पर निर्भर है। यदि आप अपने वीबीओ को कई बार बदलने से बच सकते हैं, तो मैं आपको ऐसा करने की सलाह दूंगा। – tibur

10

वहाँ एक और विकल्प है, जो विकल्प 3 की तरह एक सा है - एक बड़ा VBO (शायद के साथ GL_STREAM_DRAW मोड) है कि प्रत्येक फ्रेम रीसेट तो glMapBuffer (एक NULL बफर सूचक और एक ही आकार हर बार साथ glBufferData फोन करके) का उपयोग अभी ठीक है। बफर को मैप किया गया है क्योंकि इसे भर दिया गया है, फिर ड्राइंग से पहले अनैप किया गया है। दोहराएँ।

glBufferData पर कॉल ओपनजीएल को बताता है कि पुराने बफर सामग्री की आवश्यकता नहीं है, इसलिए glMapBuffer को GPU द्वारा GPU समाप्त होने के लिए संभावित रूप से प्रतीक्षा करने की आवश्यकता नहीं है।

यह दृष्टिकोण vertex_buffer_object एक्सटेंशन द्वारा आधिकारिक रूप से स्वीकृत एक प्रतीत होता है।

http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt

यह पता चलता है कि ओपन (या ड्राइवर?) इतना है कि व्यवहार की इस तरह के लिए देख रहे हो जाएगा, और (जब देखा) की व्यवस्था बातें: उदाहरण के लिए "एक मैप की गई बफर वस्तु का उपयोग कर वर्टेक्स सरणियों" देखें यह कुशलता से किया जाता है।

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