मुझे ओपनजीएल के साथ कई ऑब्जेक्ट्स को संभालने/प्रस्तुत करने में थोड़ा कठिनाई हो रही है। मैंने चारों ओर देखा है और Google और ओपनजीएल लाल पुस्तक में जवाब मिलते हैं जो कि मैं समझने की कोशिश कर रहा हूं, लेकिन मुझे यह देखने की ज़रूरत है कि मेरे पास सही विचार है या नहीं।ओपनजीएल एकाधिक ऑब्जेक्ट्स को संभालने
मेरा पहला विचार यह था कि मुझे क्रमशः एक्स, वाई, और जेड के लिए अनुवाद और घूर्णन चर के साथ स्थानीय डेटा को संभालना चाहिए। प्रत्येक उदाहरण मैं प्रस्तुत करना चाहते हैं के लिए है कि वर्ग के लिए एक स्थिर VBO में एक भी जाल स्टोर, तो
- लोड पहचान
- करने के लिए एक के लिए अगले पाश विशिष्ट वस्तु के स्थान/रोटेशन
- उपयोग करने के लिए बदलने drawarrays अगले ऑब्जेक्ट
- पाश उस स्थान पर जाल प्रस्तुत करना और हर वस्तु
हर फ्रेम अद्यतन प्रभाव प्रदर्शन रों के लिए इस तरह परिवर्तनों से निपटने है के लिए ऊपर दोहराने के लिए ignificantly?
कोई अन्य तरीका जिसका कोई उल्लेख कर रहा था वह एक ही वीबीओ में प्रत्येक चरम के लिए सभी स्थान डेटा को चिपका रहा था और फिर इसे एक कॉल के साथ प्रस्तुत कर रहा था। इस विधि में, मैं एक ऑब्जेक्ट को 'बनाना' मान रहा हूं, मुझे प्रत्येक वर्टेक्स के लोकल डेटा को उस फ़ंक्शन के माध्यम से संसाधित करने की आवश्यकता होगी जो स्थानीय समन्वय (स्थिर सरणी के माध्यम से) ले लेगा और उस विशिष्ट ऑब्जेक्ट का स्थान डेटा को कशेरुक में जोड़ देगा, फिर इसे वीबीओ में स्टोर करें? यदि ऐसा है, तो मैं रोटेशन को कैसे संभालेगा?
तीसरा विचार था कि ऑब्जेक्ट के हर उदाहरण में 4x4 मैट्रिक्स स्टोर करना था जिसमें अनुवाद/रोटेशन जानकारी होगी, फिर जब मैं प्रस्तुत करने के लिए जाता हूं, तो मैं उस ऑब्जेक्ट के मैट्रिक्स को लोड करता हूं, जाल को खींचता हूं एकल वीबीओ, फिर अगली ऑब्जेक्ट के मैट्रिक्स को लोड करें, उसी वीबीओ, आदि से ड्रॉ करें ....
अंत में, मैंने देखा है कि कुछ लोगों ने प्रत्येक एकल ऑब्जेक्ट के लिए वीबीओ रखने और हर एक उदाहरण के लिए ड्रैरेरे को कॉल करने का सुझाव दिया है। इस तरह से मेरे लिए बहुत अक्षम लगता है, और मुझे आश्चर्य होता है कि वीबीओ होने का क्या मतलब होगा यदि आप इसे हर जाल के लिए बुला रहे हैं। यह तत्काल मोड की तरह लगता है (मैं समझता हूं कि यह अवमूल्यन है) बस इतना तेज होगा क्योंकि आपके पास प्रत्येक ऑब्जेक्ट के लिए वीबीओ बनाने और बाध्य करने का ओवरहेड नहीं है।
क्या एकाधिक ऑब्जेक्ट्स को संभालने/प्रतिपादित करने के इन सभी तरीकों में से कोई भी वैध है? यदि हां, तो प्रत्येक विधि के लिए फायदे और नुकसान क्या हैं?
सबसे अधिक समझने वाली विधियां वे हैं जिनके पास एक ही वीबीओ प्रति जाल है, फिर या तो उन्हें प्रति अद्यतन बदलना, या प्रत्येक ऑब्जेक्ट के मैट्रिक्स को प्रति अद्यतन लोड करना और उस तरह से प्रस्तुत करना। मैं ओपनजीएल और ग्राफिक्स प्रतिपादन के लिए काफी नया हूं, इसलिए मैं कई ऑब्जेक्ट्स प्रस्तुत करने के लिए आवश्यक जानकारी को संभालने के इष्टतम तरीकों को पूरी तरह से समझने की कोशिश कर रहा हूं।
यदि ऑब्जेक्ट्स की स्थिति का एक सेट स्थैतिक है, यानी गतिशील रूप से परिवर्तित न करें, तो उन्हें एक सामान्य परिवर्तन के साथ एक एकल VBO में डालें और उन्हें एक एकल glDrawElements कॉल * के साथ चित्रित करें * पुनरावृत्ति से अधिक प्रदर्शनकारी है ऑब्जेक्ट्स पर, ऑब्जेक्ट द्वारा प्रत्येक वस्तु को चित्रित करना। लेकिन केवल स्थिर ज्यामिति और पदों के लिए। – datenwolf
यह निश्चित रूप से वीबीओ था और वीएओ नहीं था। तो मेरा सवाल यह है: क्या मैं किसी भी तरह से प्रत्येक ऑब्जेक्ट की मैट्रिक्स को वीबीओ में संग्रहीत करता हूं और इसे बाध्य वीएओ के माध्यम से शेडर पर भेजता हूं? –
यदि आप इंस्टेंट ड्रॉ कर रहे हैं - हाँ। उदाहरण के लिए आप मॉडल-व्यू मैट्रिक्स को एक इंस्टेंट विशेषता ('glVertexAttribDivisor' के साथ) बना सकते हैं। या आप matrices को वर्दी सरणी के रूप में सेट कर सकते हैं और 'gl_InstanceID' का उपयोग करके इस सरणी को इंडेक्स कर सकते हैं। गैर-इंस्टॉलेशन ड्रा के रूप में, मुझे उस मैडरिक्स का उपयोग करने वाले शेडर में जानने के लिए एक समझदार तरीका नहीं पता है। – chill