2012-11-22 12 views
6

मुझे ओपनजीएल के साथ कई ऑब्जेक्ट्स को संभालने/प्रस्तुत करने में थोड़ा कठिनाई हो रही है। मैंने चारों ओर देखा है और Google और ओपनजीएल लाल पुस्तक में जवाब मिलते हैं जो कि मैं समझने की कोशिश कर रहा हूं, लेकिन मुझे यह देखने की ज़रूरत है कि मेरे पास सही विचार है या नहीं।ओपनजीएल एकाधिक ऑब्जेक्ट्स को संभालने

मेरा पहला विचार यह था कि मुझे क्रमशः एक्स, वाई, और जेड के लिए अनुवाद और घूर्णन चर के साथ स्थानीय डेटा को संभालना चाहिए। प्रत्येक उदाहरण मैं प्रस्तुत करना चाहते हैं के लिए है कि वर्ग के लिए एक स्थिर VBO में एक भी जाल स्टोर, तो

  • लोड पहचान
  • करने के लिए एक के लिए अगले पाश विशिष्ट वस्तु के स्थान/रोटेशन
  • उपयोग करने के लिए बदलने drawarrays अगले ऑब्जेक्ट
  • पाश उस स्थान पर जाल प्रस्तुत करना और हर वस्तु

हर फ्रेम अद्यतन प्रभाव प्रदर्शन रों के लिए इस तरह परिवर्तनों से निपटने है के लिए ऊपर दोहराने के लिए ignificantly?

कोई अन्य तरीका जिसका कोई उल्लेख कर रहा था वह एक ही वीबीओ में प्रत्येक चरम के लिए सभी स्थान डेटा को चिपका रहा था और फिर इसे एक कॉल के साथ प्रस्तुत कर रहा था। इस विधि में, मैं एक ऑब्जेक्ट को 'बनाना' मान रहा हूं, मुझे प्रत्येक वर्टेक्स के लोकल डेटा को उस फ़ंक्शन के माध्यम से संसाधित करने की आवश्यकता होगी जो स्थानीय समन्वय (स्थिर सरणी के माध्यम से) ले लेगा और उस विशिष्ट ऑब्जेक्ट का स्थान डेटा को कशेरुक में जोड़ देगा, फिर इसे वीबीओ में स्टोर करें? यदि ऐसा है, तो मैं रोटेशन को कैसे संभालेगा?

तीसरा विचार था कि ऑब्जेक्ट के हर उदाहरण में 4x4 मैट्रिक्स स्टोर करना था जिसमें अनुवाद/रोटेशन जानकारी होगी, फिर जब मैं प्रस्तुत करने के लिए जाता हूं, तो मैं उस ऑब्जेक्ट के मैट्रिक्स को लोड करता हूं, जाल को खींचता हूं एकल वीबीओ, फिर अगली ऑब्जेक्ट के मैट्रिक्स को लोड करें, उसी वीबीओ, आदि से ड्रॉ करें ....

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

क्या एकाधिक ऑब्जेक्ट्स को संभालने/प्रतिपादित करने के इन सभी तरीकों में से कोई भी वैध है? यदि हां, तो प्रत्येक विधि के लिए फायदे और नुकसान क्या हैं?

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

उत्तर

3
  • विशिष्ट वस्तु के स्थान/रोटेशन

कि बस आप एक समान चर करने के लिए एक 4x4 मैट्रिक्स लोड का मतलब करने के लिए बदलना।

क्या प्रत्येक फ्रेम अपडेट के लिए इस तरह के परिवर्तनों को संभालने से प्रदर्शन पर असर पड़ता है?

रूपांतरण आपके वर्टेक्स शेडर में किया जाएगा, थर्म उपरोक्त मैट्रिक्स और वर्टेक्स निर्देशांक द्वारा गुणा करके, कई शीर्षकों के समानांतर में।

एक और तरीका है कि किसी को तो एक भी VBO में हर शिखर के लिए स्थानीय डेटा के सभी चिपके हुए एक कॉल के साथ यह प्रतिपादन उल्लेख किया गया था। इस विधि में, मैं मानता हूं कि किसी ऑब्जेक्ट को 'बनाना' है, मुझे प्रत्येक वर्टेक्स के लोकल डेटा को उस फ़ंक्शन के माध्यम से संसाधित करने की आवश्यकता होगी जो स्थानीय समन्वय (स्थिर सरणी के माध्यम से) और उस विशिष्ट ऑब्जेक्ट का स्थान डेटा को उसमें जोड़ देगा वर्टेक्स, फिर इसे वीबीओ में स्टोर करें? यदि यह मामला है, तो मैं रोटेशन को कैसे संभालेगा?

यह एक बहुत अच्छा विचार प्रतीत नहीं होता है, क्योंकि आपको प्रत्येक फ्रेम (या कम से कम ऑब्जेक्ट स्थिति/अभिविन्यास chages) पर डेटा अपलोड करना होगा।

तीसरी विधि, पहले के रूप में ही लगता है केवल OGL3 + शर्तों, में wheras पहले ओजीएल 2.x शर्तों :)

अंत में की तरह लगता है, मैंने देखा है कुछ लोगों को एक VBO होने की सलाह देते हैं प्रत्येक एकल ऑब्जेक्ट के लिए और प्रत्येक एकल उदाहरण के लिए drawarray को कॉल करना।

शायद आप गलत समझा और वे वीओओ नहीं, वीएओ का मतलब था? एक वीएओ, आप वर्टेक्स विशेषताओं (वीबीओ में) अपलोड करते हैं, वीएओ बांधते हैं, प्रत्येक वीबीओ को उपयुक्त विशेषता स्थान पर बांधते हैं और शुरुआत में केवल एक बार ऐसा करते हैं। प्रत्येक फ्रेम पर आप बस कार्य करें:

// Bind the VAO 
glBindVertexArray(vao) 

// Draw the object 
glDrawArrays/glDrawArraysInstanced/etc. 

// CLear VAO binding 
glBindVertexArray(0) 

नोट आप अभी भी शिखर हो सकता है कि एक ही VBO में कई अलग वस्तु के लिए जिम्मेदार बताते हैं, glDrawArrays याद और दूसरों एक पैरामीटर है, जो जहां सरणी में ड्राइंग शुरू करने के लिए निर्धारित किया है।

+1

यदि ऑब्जेक्ट्स की स्थिति का एक सेट स्थैतिक है, यानी गतिशील रूप से परिवर्तित न करें, तो उन्हें एक सामान्य परिवर्तन के साथ एक एकल VBO में डालें और उन्हें एक एकल glDrawElements कॉल * के साथ चित्रित करें * पुनरावृत्ति से अधिक प्रदर्शनकारी है ऑब्जेक्ट्स पर, ऑब्जेक्ट द्वारा प्रत्येक वस्तु को चित्रित करना। लेकिन केवल स्थिर ज्यामिति और पदों के लिए। – datenwolf

+1

यह निश्चित रूप से वीबीओ था और वीएओ नहीं था। तो मेरा सवाल यह है: क्या मैं किसी भी तरह से प्रत्येक ऑब्जेक्ट की मैट्रिक्स को वीबीओ में संग्रहीत करता हूं और इसे बाध्य वीएओ के माध्यम से शेडर पर भेजता हूं? –

+1

यदि आप इंस्टेंट ड्रॉ कर रहे हैं - हाँ। उदाहरण के लिए आप मॉडल-व्यू मैट्रिक्स को एक इंस्टेंट विशेषता ('glVertexAttribDivisor' के साथ) बना सकते हैं। या आप matrices को वर्दी सरणी के रूप में सेट कर सकते हैं और 'gl_InstanceID' का उपयोग करके इस सरणी को इंडेक्स कर सकते हैं। गैर-इंस्टॉलेशन ड्रा के रूप में, मुझे उस मैडरिक्स का उपयोग करने वाले शेडर में जानने के लिए एक समझदार तरीका नहीं पता है। – chill

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