2009-01-28 15 views
11

यह कुछ ऐसा है जो मैं देख रहा हूं, लेकिन मुझे अभी तक कोई ठोस जानकारी या अच्छे उदाहरण नहीं मिल पाए हैं। मैंने कहा है, अनकनेक्टेड ऑब्जेक्ट्स का एक समूह (उदाहरण के लिए त्रिकोण स्ट्रिप्स)। इन्हें प्रस्तुत करने का कुशल तरीका क्या है?ओपनजीएल: ज्यामिति के बैच को प्रस्तुत करने का कुशल तरीका?

मैंने ओपनजीएल कॉल को कम करने के लिए एक वीबीओ में कई ऑब्जेक्ट्स डालने के बारे में सुना है, लेकिन इसे कैसे किया जाए इसका एक उचित उदाहरण नहीं देखा है। मैंने उन पदों को भी देखा है जो इस विचार का विरोधाभास करते हैं। तो अभी, मैं ज्यादातर उलझन में हूँ।

+0

मैंने अभी http://craiggiles.wordpress.com/2009/08/03/opengl-es-batch-rendering-on-the-iphone/ पर उल्लिखित एक विधि लागू की है और यह अच्छी तरह से काम करता है। – RandomEtc

उत्तर

15

सबसे पहले, आपको शायद हर समय वीबीओ का उपयोग करना चाहिए। छोटी और बड़ी वस्तुओं के लिए।

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

यदि कोई वस्तु त्रिकोण सूची है, तो संयोजन आसान है - बस स्रोत सूचियों में से एक बड़ी त्रिकोण सूची बनाएं। यदि कोई ऑब्जेक्ट त्रिकोण स्ट्रिप है, तो आपको स्ट्रिप्स में शामिल होने के लिए "degenerate त्रिकोण" का उपयोग करना होगा (यह एक ऑब्जेक्ट के लिए भी बहुत उपयोगी अनुकूलन है, अगर इसे एक स्ट्रिप के रूप में प्रदर्शित नहीं किया जा सकता है)।

एक "अपरिवर्तनीय त्रिकोण" एक त्रिभुज है जिसमें दो या तीन समान वर्टेक्स सूचकांक होते हैं। ग्राफिक्स हार्डवेयर उन्हें पहचान सकते हैं और उन्हें बहुत तेज़ी से छोड़ सकते हैं।

तो यदि आपके पास है, उदा। कुल छः शिखर के लिए प्रत्येक एक त्रिकोण के साथ दो स्ट्रिप्स।

स्ट्रिप्स के मूल त्रिकोण सूचकांक होगा:

1) 0, 1, 2 
2) 0, 1, 2 

अब आप सभी कोने एक साथ शामिल है, तो आप 6 कोने के साथ खत्म।

1) 0, 1, 2 (unchanged) 
2) 3, 4, 5 

अब तक आपके पास एक वर्टेक्स सरणी है, लेकिन फिर भी दो अलग स्ट्रिप्स हैं। उन्हें डालने पतित त्रिकोण से शामिल होने के लिए है:

1) 0, 1, 2, 2, 2, 3, 4, 5 

(मुझे लगता है कि इसके बाद के संस्करण सही है, लेकिन वास्तव में सत्यापित नहीं किया है)

विचार यह है: ऊपर पट्टी के साथ, ग्राफिक्स कार्ड त्रिकोण ड्रा करेंगी इन कोने से बाहर:

0, 1, 2 
1, 2, 2 <- degenerate! won't be drawn 
2, 2, 2 <- degenerate! won't be drawn 
2, 2, 3 <- degenerate! won't be drawn 
3, 4, 5 

सामान्य स्थिति में, आप या तो इतना है कि त्रिकोण घुमावदार सही रहता है, दो या तीन पतित मूल पट्टी लंबाई के आधार पर त्रिकोण सम्मिलित करने के लिए की है।

+0

आप केवल एक प्रदर्शन सूची संकलित क्यों नहीं कर सकते जो GL_TRIANGLE_STRIP का उपयोग करता है? – aib

+1

@ एआईबी: क्योंकि आप कभी भी सुनिश्चित नहीं हो सकते * * * एक प्रदर्शन सूची संकलित करता है। डिस्प्ले सूचियों को ओपनजीएल 3.0 में बहिष्कृत किया गया है, और अधिकांश अन्य प्लेटफार्मों (डी 3 डी, ओपनजीएल ईएस, कंसोल एपीआई, ...) पर मौजूद नहीं है। वे सिर्फ हार्डवेयर के लिए अच्छी तरह से मानचित्र नहीं है। – NeARAZ

+1

यह 0 1 2 [2 2 3] 3 4 5 नहीं होना चाहिए? 0 1 2, [2 1 2, 2 2 2, 2 2 3, 3 2 3, 3 3 4,] 3 4 5 के रूप में खींचा गया? – eplawless

1

glDrawElements() में देखें, यह आप जो चाहते हैं उसे प्राप्त करने का एक अच्छा तरीका है। ध्यान दें कि यदि आपका डेटा प्रत्येक फ्रेम को बदलता है तो प्रदर्शन ड्रॉप हो सकता है, क्योंकि तब आपको डेटा के प्रासंगिक भाग अपडेट करने की आवश्यकता होती है, जिसका अर्थ है कि उन्हें ग्राफिक्स कार्ड की मेमोरी में कॉपी करें। स्थिर डेटा के लिए, यह बहुत तेज़ है।

+0

या इससे भी बेहतर; आप glmultiDrawIndirect() अब उपयोग कर सकते हैं :) – MattMatt