2011-08-08 12 views
7

में वर्टेक्स बफर ऑब्जेक्ट्स (मैंने 2.1 निर्दिष्ट किया है क्योंकि मेरा लैपटॉप उस संस्करण से पहले नहीं जायेगा। मैं शायद 3.x के बाद से ऐसा कर सकता हूं और शेडर्स को अनिवार्य रूप से पेश करता हूं?)।ओपनजीएल 2.1

विकिपीडिया के लिए धन्यवाद: http://en.wikipedia.org/wiki/Vertex_Buffer_Object मुझे यह समझना शुरू हो रहा है कि वीबीओ का उपयोग करना कितना आसान हो सकता है (मैं अब भी आईबीओ के बारे में सकारात्मक नहीं हूं?)। जो मैंने अभी तक समझा है, उनका उपयोग करने का प्राथमिक कारण यह है कि डेटा मेमोरी में डेटा अब संग्रहीत होने के कारण एक प्रदर्शन बढ़ावा मिला है।

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

+0

काफी असंबद्ध टिप्पणी: वीबीओ के बारे में सकारात्मक कैसे हो सकता है और आईबीओ के बारे में नहीं, क्योंकि वे पहले भी समझते हैं, यदि वे पहले भी समझते हैं। और व्यावहारिक अनुप्रयोगों में आप अक्सर 'glDrawArrays' के बजाय' glDrawElements' का उपयोग करेंगे। –

+0

@ क्रिस्टियन राउ: मैंने अपना प्रश्न पर्याप्त स्पष्ट नहीं किया होगा, मुझे उत्सुकता है कि मुझे एक वैश्विक के बजाय एकाधिक वीबीओ बनाना है या नहीं। –

+0

मैंने आपके प्रश्न को समझ लिया (और उत्तर दिया)। यह सिर्फ इतना है कि आईबीओ वीबीओ की तुलना में अलग या कठिन नहीं हैं, जैसे केन ने कहा। –

उत्तर

5

यह निर्भर करता है, क्योंकि सवाल काफी व्यापक है।

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

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

+0

क्या मैं प्रति क्वाड में एक वीबीओ और आईबीओ का उपयोग करने में सक्षम हूं? मैं एक स्प्राइट ऑब्जेक्ट स्थापित कर रहा हूं। –

+0

@Storm आप एक वीबीओ प्रति क्वाड का उपयोग कर सकते हैं, लेकिन फिर आप केवल एक क्वाड प्रति ड्रा कॉल प्रस्तुत कर सकते हैं, जो आपके स्प्राइट ऑब्जेक्ट के लिए हो सकता है (जिसमें केवल एक क्वाड होता है)।लेकिन अगर आपको कई मिलते हैं, काफी समान होते हैं, स्प्राइट्स (जैसे कण प्रणाली में), यह निश्चित रूप से एक मामला है, जहां आपको उन सभी sprites/कणों को एक ही वीबीओ में पैक करना चाहिए, ताकि आप उन्हें एक ही बार में प्रस्तुत कर सकें। जैसे मैंने कहा, यह ठोस अनुप्रयोग पर निर्भर करता है और कण प्रणाली निश्चित रूप से एक-वीबीओ दृष्टिकोण के पक्ष में होती है। –

+0

यह समझ में आता है। क्या समान समान sprites के लिए स्प्राइट ड्रा कॉल बैच करने का कोई तरीका होगा? मुझे लगता है कि एक्सएनए अपने स्प्राइटबैच के साथ ऐसा करता है। –

2

यह वास्तव में आसान होना चाहिए - बस वीबीओ में अधिक डेटा जोड़ें।

तो, उदाहरण के लिए, यदि आप केवल 1 के बजाय 3 त्रिकोण प्रस्तुत करना चाहते हैं, तो सुनिश्चित करें कि आप 912 को glBufferData पर भेजें। फिर, उन सभी को प्रस्तुत करने के लिए, glDrawArrays(GL_TRIANGLES, 0, 9); पर कॉल करें, यह वास्तव में इतना आसान होना चाहिए।

हालांकि, आईबीओ के बारे में एक बिंदु यह है कि वे वास्तव में वीबीओ से बहुत अलग नहीं हैं, और मैं वास्तव में उनका उपयोग करने के लिए उपयोग किया जाता। यह वास्तव में वीबीओ का उपयोग करने का व्यावहारिक तरीका है। चूंकि एकाधिक त्रिकोण आमतौर पर एक ही सतह को कवर करने के लिए होते हैं (उदाहरण के लिए एक घन को बारह त्रिकोण की आवश्यकता होती है), केवल वीबीओ का उपयोग करके वर्टेक्स डेटा निर्दिष्ट करने में बहुत बार दोहराया जाता है। इंडेक्स बफर का उपयोग करके, चीजें और भी कुशल होती हैं, क्योंकि वीबीओ से कोई भी पुनरावृत्ति हटा दी जाती है। मुझे this मिला जो वीबीओ-केवल वीबीओ/आईबीओ से आगे बढ़ने का एक संक्षिप्त उदाहरण प्रदान करता है और यह परिवर्तन की अच्छी व्याख्या भी देता है।

+0

यह एक उपयोगी ट्यूटोरियल धन्यवाद था। एडी ल्यूटेन की पुस्तक के लिंक के लिए –

+0

+1, एक परियोजना जिसे मैं वास्तव में पसंद करता हूं। –

+0

हाँ, मुझे अभी पुस्तक मिली है, और वास्तव में उनकी संक्षिप्त लेखन शैली से प्रभावित हुआ था। –