2009-11-13 26 views
9

हालांकि ओपनजीएल 3.x के लिए बहुत कम तारीखों के संदर्भ में प्रतीत होता है, ओपनजीएल का वास्तविक निम्न स्तर का हेरफेर अपेक्षाकृत सीधे आगे है। हालांकि मुझे एक गतिशील दुनिया को प्रस्तुत करने के लिए वीबीओ में हेरफेर करने का संकल्प करने की कोशिश करने में गंभीर समस्या हो रही है।गतिशील दुनिया को प्रस्तुत करने के लिए मैं OpenGL 3.x VBOs का उपयोग कैसे करूं?

स्पष्ट रूप से पुराने के तत्काल मोड तरीके लागू नहीं हैं, लेकिन वहां से मैं कहां जाऊं? क्या मैं किसी प्रकार की दृश्य संरचना लिखता हूं और फिर इसे वीबीओ के लिए चरम और धारा के एक सेट में परिवर्तित करता हूं, मैं अनुवाद डेटा कैसे संग्रहीत करूं? यदि ऐसा है तो यह कोड के अनुसार कैसे दिखता है?

असल में वास्तव में अनिश्चित कैसे जारी रखें।

उत्तर

9

अपने पूरे दुनिया को सही मायने में गतिशील है, तो आप GL_STREAM_DRAW_ARB फ़्लैग का उपयोग करने का उपयोग कर सकते और प्रत्येक फ्रेम पर डेटा रीसेट करें। इसे छेड़छाड़ न करें, बस यथासंभव कुशल स्ट्रीम करने का प्रयास करें।

हालांकि, मुझे लगता है कि आपके पास एक दृश्य है जिसमें कई कठोर वस्तुएं होती हैं जो एक दूसरे के सापेक्ष स्थानांतरित होती हैं। इस मामले में, प्रत्येक ऑब्जेक्ट के लिए एक VBO का उपयोग करें और GL_STATIC_DRAW_ARB उपयोग ध्वज निर्दिष्ट करें। फिर आप ऑब्जेक्ट के प्रत्येक इंस्टेंस के लिए मॉडलव्यू ट्रांसफॉर्म सेट कर सकते हैं और प्रति उदाहरण एक ड्रॉ कॉल का उपयोग करके उन्हें प्रस्तुत कर सकते हैं।

अंगूठे का एक नियम (पीसी पर) आपके सीपीयू के प्रति मेगाहर्ट्ज से अधिक ड्रॉ कॉल जारी नहीं करना है। यह एक कच्चा अनुमान है, लेकिन इसमें कुछ सच है। यदि आप इस सीमा से नीचे रहते हैं तो एकाधिक स्वतंत्र वस्तुओं को एक एकल वीबीओ या अन्य प्रदर्शन चाल में डालने की चिंता न करें।

+1

+1 बैचिंग को पहचानने के लिए इन दिनों ग्राफिक्स कोडिंग के साथ सबसे बड़ी समस्या है। 1 ड्रॉ कॉल प्रति एमएचजेड कुछ ओपनजीएल ईएस आईफोन कोडिंग के बाद मुझे आशावादी लगता है - मुझे पता चला है कि मैं एक सभ्य फ्रेमवर्क बनाए रखने के लिए 30-40 बैचों तक सीमित हूं! – tsalter

+0

ठीक है, मुझे यह जोड़ना चाहिए था कि यह नियम सीधे मोबाइल उपकरणों पर लागू नहीं हो सकता है। मैंने इसे कुछ साल पहले कुछ जीडीसी स्लाइड्स पर देखा है, और यह मुझे विंडोज पीसी पर अच्छी तरह से सेवा देता है। –

+0

बीटीडब्ल्यू, मुझे बस यहां स्लाइड्स मिलीं: http://ati.amd.com/developer/gdc/D3DTutorial3_Pipeline_Performance.pdf (मुख्य रूप से डी 3 डी 9, ओपनजीएल पृष्ठ 28 पर) –

5

वीबीओ का उपयोग करने का मतलब यह नहीं है कि आपको अपने पूरे दृश्य को केवल एकल ड्रा कॉल के साथ प्रस्तुत करना होगा। आप अभी भी कई ड्रॉ कॉल जारी कर सकते हैं, और रास्ते में विभिन्न रूपांतरण मैट्रिक्स सेट अप कर सकते हैं।

उदाहरण के लिए, यदि आप एक दृश्यग्राफ का उपयोग कर रहे हैं, तो दृश्यग्राफ में प्रत्येक मॉडल एक एकल ड्रॉ कॉल के अनुरूप हो सकता है। ऐसे मामले में, वीबीओ का उपयोग करने का सबसे आसान तरीका प्रत्येक मॉडल के लिए एक अलग वीबीओ बना रहा है।

एक अनुकूलन के रूप में, आप कई मॉडलों को एक एकल वीबीओ में जोड़ सकते हैं, फिर अपनी ड्रा कॉल करते समय गैर-शून्य ऑफ़सेट में प्रवेश कर सकते हैं; यह वीबीओ से सही मॉडल निकाल देता है। एक ड्रॉ कॉल में एकाधिक ड्रॉ कॉल को गठबंधन करना भी वांछनीय है, लेकिन यदि संभवतः उन्हें स्वतंत्र रूपांतरित करने की आवश्यकता है तो यह संभव नहीं है। (वास्तव में यह कुछ स्थितियों में संभव है यदि आप instancing या शीर्ष सम्मिश्रण का उपयोग करें, लेकिन मैं पहले रास्ते से बाहर मूल बातें सुझाव देते हैं।)

9

लघु जवाब:

उपयोग glMapBufferRange और केवल subrange कि संशोधन की जरूरत है अद्यतन करें।

लांग जवाब:

चाल glMapBufferRangeसाथ पहले से ही विद्यमान बफर मैप करने के लिए, और उसके बाद ही सीमा आप की जरूरत के नक्शे है। यह देखते हुए इन मान्यताओं:

  • आपका ज्यामिति प्रति-शिखर एनीमेशन
  • morphing मॉडल के लिए शीर्ष गणना का उपयोग करता है एनीमेशन के दौरान निरंतर है।

तो फिर तुम ही बदल रहा है भागों को अद्यतन करने के glMapBufferRange उपयोग करते हैं, और अकेले डेटा के बाकी छोड़ सकते हैं। का उपयोग कर पूर्ण अपलोड्स glbufferData एक कछुए के रूप में धीमे हैं, क्योंकि वे पुरानी मेमोरी स्टोर को हटाते हैं और एक नया आवंटित करते हैं। यह नया डेटा अपलोड करने के अतिरिक्त है। glMapBufferRange केवल आपको मौजूदा डेटा को पढ़ने/लिखने देता है, यह कोई आवंटन या अस्वीकरण नहीं करता है।

हालांकि, यदि आप कंकाल एनीमेशन का उपयोग करते हैं, तो वर्टेक्स शेड को 4x4 मैट्रिक्स प्रति-वर्टेक्स के रूप में वर्टेक्स ट्रांसफॉर्मेशन पास करें, और वहां गणना करें। प्रति-वर्टेक्स डेटा निश्चित रूप से glVertexAttribPointer के साथ निर्दिष्ट है।

साथ ही, याद रखें कि आप वर्टेक्स शेडर में बनावट डेटा पढ़ सकते हैं, और ओपनजीएल 3.1 ने कुछ नए इंस्टेंस ड्रा कॉल पेश किए हैं; glDrawArraysInstanced और glDrawElementsInstanced। उन संयुक्त का उपयोग उदाहरण-विशिष्ट लुकअप के लिए किया जा सकता है। मैं आप एक ही ज्यामिति डेटा के साथ उदाहरण ड्रॉ कॉल कर सकता हूं, लेकिन पदों या जो भी प्रति-वर्टेक्स डेटा आपको बनावट या बनावट-सरणी के रूप में चाहिए, भेजता है। यह आपको विभिन्न वर्टेक्स सरणी डेटा सेटों को मिलाकर और मिलान करने से बचा सकता है।

कल्पना कीजिए कि क्या आप एक ही मॉडल के 100 उदाहरण प्रस्तुत करना चाहते हैं, लेकिन विभिन्न पदों या रंग योजनाओं के साथ। या यहां तक ​​कि बनावट मानचित्र।