2010-05-31 12 views
5

मैं ओपनजीएल के साथ 2 डी गेम बना रहा हूं। मैं वीबीओ का उपयोग कर अपने बनावट ड्राइंग को तेज करना चाहता हूं।वर्टेक्स बफर ऑब्जेक्ट्स के साथ ओपनजीएल फास्ट बनावट ड्राइंग। क्या ऐसा करने का यह तरीका है?

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

मैं सोच रहा था, यह कोई शामिल ऑफसेट तो मैं तो glTranslate, glScale और glRotate उपयोग कर सकते हैं मेरी बनावट के लिए ड्राइंग स्थिति को स्थानांतरित करने के साथ बनावट के पक्षों के लिए कोने के साथ एक VBO बनाने के लिए सबसे तेजी से होगा। फिर मैं वही वीबीओ का उपयोग कर सकता हूं जिसमें प्रत्येक बार बनावट बनाने के लिए कोई बदलाव नहीं होता है। जब मैं गोलाकार कोनों के लिए निर्देशांक जोड़ना चाहता हूं तो मैं केवल वीबीओ बदल सकता हूं।

क्या यह करने का सबसे अच्छा तरीका है? ऐसा करने के दौरान मुझे किन चीजों को देखना चाहिए? क्या आधुनिक ग्राफिक्स कार्ड में GL_QUADS के बजाय GL_TRIANGLES का उपयोग करना वास्तव में सबसे तेज़ है?

किसी भी उत्तर के लिए धन्यवाद।

उत्तर

4

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

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

आखिरकार, आधुनिक ओपनजीएल विनिर्देशों में GL_QUADS को भी बहिष्कृत किया गया है। वे वैसे भी अधिक कार्यक्षमता प्रदान नहीं करते हैं, इसलिए आपको क्वाड्स को त्रिकोण या त्रिकोण स्ट्रिप्स/प्रशंसकों पर स्विच करना चाहिए।

+0

धन्यवाद। मैंने वीबीओएस को कुछ लाइन कोड के लिए काम करने में कामयाब रहा है लेकिन बनावट ड्राइंग के लिए नहीं। मुझे कोई संकेत नहीं मिला कि यह कैसे करें। मैंने जो भी कोशिश की वह असफल रहा। मुझे लगता है मुझे एक और सवाल चाहिए। –

+0

क्या आप अपनी ऑब्जेक्ट्स देखते हैं जहां आप उन्हें चाहते हैं? क्या यह केवल आपके मॉडल का सही बनावट है? यदि आप अपनी ऑब्जेक्ट को सही स्थिति में देखते हैं, तो बस ध्यान रखें कि बनावट समन्वय मान वर्टेक्स स्थिति मानों की तरह हैं। कुछ आसान से शुरू करें (बनावट मैट्रिक्स मोड में glTranslate आदि का उपयोग कर बनावट निर्देशांक को संशोधित न करें), फिर आप जो अंततः देखना चाहते हैं उसे प्राप्त करने के लिए इसे विस्तारित करने का प्रयास करें। – AdilYalcin

+0

वर्तमान में यह सही जगह पर प्रतिपादन कर रहा है, यह ठीक से प्रस्तुत नहीं किया जा रहा है। यह GL_QUADS और GL_TRIANGLES दोनों के लिए विफल रहता है। मैं अपने वीबीओ कोड के साथ एक नया सवाल करूंगा। क्या वीबीओ को रंग जानकारी जोड़ना महत्वपूर्ण है? क्या "ग्लोकोलर" एक समस्या है? आपके उत्तर और सहायता के लिए धन्यवाद। –

1

यदि आप वीबीओ का उपयोग करके एक बनावट बहुभुज बनाना चाहते हैं, तो आपको न केवल ऊर्ध्वाधर के लिए बफर बनाना होगा, बल्कि बनावट निर्देशांक (प्रत्येक यूवी समन्वय प्रति चरम) और वर्टेक्स रंगों के लिए भी यदि आप वर्टेक्स करना चाहते हैं प्रकाश (यदि नहीं तो glcolor का उपयोग करें)। इच्छित बनावट को बाध्य करने से पहले glClientActiveTexture (GL_TEXTUREn) का उपयोग करें। रेंडर कॉल जारी करने से पहले आप उपयोग कर रहे प्रत्येक बफर प्रकार के लिए glEnableClientState() का उपयोग करना न भूलें।