वहाँ gl_quads का उपयोग करने के लिए अभी भी फायदे हैं?


10

ठीक है, मैं समझता हूं कि gl_quads को पदावनत किया जाता है, और इस प्रकार अब हम उनका उपयोग नहीं कर रहे हैं। मैं यह भी समझता हूं कि gl_quads का उपयोग करके एक गेम चलाने पर एक आधुनिक पीसी वास्तव में दो त्रिकोण बना रहा है।

अब, मैंने सुना है कि इसके बजाय त्रिकोण का उपयोग करके एक खेल लिखा जाना चाहिए। लेकिन मैं सोच रहा हूँ कि, अगर OpenGL उस क्वैड को दो त्रिभुजों में कैसे बनाता है, तो इसकी वजह से कभी भी पैड का उपयोग करना फायदेमंद होता है?

विशेष रूप से, मैं वर्तमान में बड़े बफर ऑब्जेक्ट्स से कई असंबद्ध quads प्रदान कर रहा हूं। उन क्षेत्रों में से एक जो मुझे सावधान रहना है कि इन बफर ऑब्जेक्ट्स को बनाने / अपडेट करने के लिए मैं कितनी बड़ी संख्या में फ्लोट्स का वेक्टर उपयोग कर रहा हूं (मेरे पास प्रति वर्सेट में कुछ अतिरिक्त फ्लोट मान हैं, और एक बफर में बहुत सी वर्तनियाँ हैं - सबसे बड़ी बफ़र्स लगभग 500KB हैं)।

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

अगर gl_quads अभी भी काम करता है, तो क्या मुझे यहाँ लाभ मिल रहा है, या 50% अतिरिक्त मेमोरी और CPU समय अभी भी OpenGL के स्वचालित रूपांतरण पर दो त्रिकोणों में उपयोग किया जा रहा है?


5
मुझे यकीन है कि ओपनग्ल किसी प्रकार के अनुक्रमित वर्टेक्स बफर का समर्थन करता है, जिसका अर्थ है कि आप एक क्वाड के लिए केवल 4 वर्टिकल स्टोर करते हैं, और दो त्रिकोण बनाने के लिए पूरे कोने को दोहराने के बजाय, आप केवल सूचक दोहराते हैं: [0,1,2] , [2,3,0]


मुझे विश्वास है कि जीएल कल्पना अभी भी कुछ मामलों को निर्धारित करती है जहां एक क्वाड मामलों के रूप में ड्राइंग की जाती है, जैसे कि ग्लोपोलीगॉनमोड (..., जीएल .0 लाईन)।
मैक्सिमस मिनिमस

जवाबों:


5

अपने वास्तविक खेल का परीक्षण करें। यदि क्वाड तेज हैं, तो उन का उपयोग करें। यदि नहीं, नहीं।

एक कारण हो सकता है कि वे कुछ मामलों में धीमे हैं क्योंकि कुछ हार्डवेयर क्वाड का समर्थन नहीं करते हैं, इसलिए ड्राइवर को क्वाड ड्रॉ कॉल को "ठीक" करने के लिए बहुत काम करना पड़ता है। कुछ हार्डवेयर क्वैड का समर्थन करते हैं, कुछ निश्चित-फ़ंक्शन इनपुट असेंबली चरण में त्रिभुजों को विभाजित करते हैं, इसलिए यह बिना किसी महत्वपूर्ण ओवरहेड के काम करता है। आपके द्वारा उठाए गए के रूप में कैसे अनुक्रमित बनाम गैर-अनुक्रमित सबमिट किए जाने के बारे में भी सवाल हैं, और जो सीमित बस ट्रांसफर बैंडविड्थ और सीपीयू पीढ़ी के समय का बेहतर उपयोग करता है। लोक ज्ञान कहता है कि quads से बचें, जो कि अच्छी सलाह है यदि आप कुछ भी नहीं से शुरू कर रहे हैं, तो शायद इतना नहीं अगर आपका कोड पहले से ही काम करता है। लोक ज्ञान का कहना है कि बहुत सी चीजें वास्तविक, अच्छे प्रदर्शन के बावजूद हत्या का प्रदर्शन करती हैं।

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


3

विकल्प क्या हैं? खैर, एक विकल्प ज्योमेट्री शेड्स का उपयोग करना है , एक GL_LINES_ADJACENCYआदिम (4 कोने) पास करना और जीएस को इस आदिम को त्रिकोण पट्टी में बदलना है। हालाँकि, यह रेंडर करने के लिए धीमा होने वाला है, क्योंकि किसी को यह मान लेना चाहिए कि ज्योमेट्री शेड्स हमेशा रेंडर करने के लिए धीमे होते हैं।

एक बेहतर तरीका अनुक्रमित प्रतिपादन का उपयोग करना है। यहां, आपके पास दो विकल्प हैं: GL_TRIANGLESऔर GL_TRIANGLE_STRIPआदिम पुनरारंभ के साथ। उत्तरार्द्ध एक छोटे से कम सूचकांक बफर (हर ट्रैक्टर के लिए एक सूचकांक) में परिणाम होगा। आप किसी भी क्वाड रेंडरिंग के लिए एक ही इंडेक्स बफर का पुनः उपयोग कर सकते हैं, इसलिए आपको इंडेक्स बफर को अपडेट या संशोधित करने की आवश्यकता नहीं होगी।

मैं सूचकांक प्रकार के रूप में अहस्ताक्षरित शॉर्ट्स का उपयोग करने का भी सुझाव दूंगा। यदि आपको एक साथ 16384 से अधिक रेंडर करने की आवश्यकता है, तो सूचकांकों को ऑफसेट करने के लिए glDrawElementsBaseVertex का उपयोग करके कई रेंडरिंग कॉल करें ।


मैंने हाल ही में किए गए कुछ बेंचमार्किंग glMultiDrawArrays को अब NV और AMD दोनों पर एक तेज़ पथ बनाया है (इंटेल से परेशान नहीं) इसलिए एक और विकल्प है - glMultiDrawArrays फैन या स्ट्रिप के साथ।
मैक्सिमस मिनिमस

@ mh01: इसके लिए ड्रॉइंग कमांड्स के क्लाइंट-साइड ऐरे की आवश्यकता होती है। आपको glMultiDrawArraysIndirectइसे GPU-side करना होगा। जो आप कर सकते हैं, लेकिन यह हार्डवेयर को सीमित करता है।
निकोल बोलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.