OpenGL ES में क्वैड्स खींचने का सबसे तेज़ तरीका?


22

मैं ओपनजीएल ईएस 2.0 का उपयोग कर रहा हूं। मेरे पास एक गुच्छा है जिसे खींचने के लिए एक क्वाड है, मैं प्रति क्वाड केवल 4 कोने को पार करने में सक्षम होना पसंद करूंगा जैसे कि मैं GL_QUADS का उपयोग कर रहा था, लेकिन मूल रूप से मैं सिर्फ ड्राइंग का सबसे अच्छा तरीका जानना चाहता हूं अलग quads का गुच्छा।

अब तक मैंने जो कुछ भी पाया है वह कर सकता हूं: -GL_TRIANGLES (6 चक्कर प्रति क्वाड) -Deenerate GL_TRIANGLE_STRIP (6 चक्कर प्रति चक्कर)

पॉज़िबिटीज़ मैंने पाया है: -GL_TRIANGLE_STRIPS एक विशेष इंडेक्स वैल्यू के साथ जो क्वाड स्ट्रिप को रीसेट करता है (इसका मतलब प्रति क्वैड 5 इंडेक्स होगा, लेकिन मुझे नहीं लगता कि यह संभव है OpenGL ES 2.0)

जवाबों:


33

बस इंडेक्स बफर और GL_TRIANGLES का उपयोग करें। इस स्थिति में आपको 4 वर्टिकल + 6 इंडेक्स प्रति क्वैड की आवश्यकता होती है (6 अतिरिक्त इंडेक्स बड़े ओवरहेड लग सकते हैं लेकिन वास्तव में यह नहीं है - एक बार जब आप अपने इंडेक्स बफर का निर्माण कर लेते हैं तो आपको इसे फिर से छूने की आवश्यकता नहीं होती है)। अधिक जानकारी के लिए यह पृष्ठ देखें (glDrawElements के लिए खोज करें)

सरल उदाहरण कोड:

GLfloat vertices[] = {-1, -1, 0, // bottom left corner
                      -1,  1, 0, // top left corner
                       1,  1, 0, // top right corner
                       1, -1, 0}; // bottom right corner

GLubyte indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
                     0,2,3}; // second triangle (bottom left - top right - bottom right)

glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

इसके अलावा, यदि आप सिर्फ एक क्वाड ड्रॉ कर रहे हैं, तो आपको त्रिकोण स्ट्रिप्स ( जैसा कि विकिपीडिया में दिखाया गया है ) के साथ इसे खींचने के लिए केवल 4 वर्टिस की आवश्यकता है, लेकिन मुझे लगता है कि आपको पहले से ही यह पता था।


एक त्रिकोण में कई त्रिभुज स्ट्रिप्स को एक पट्टी में विलय करने की पारंपरिक चाल "पतित त्रिकोण" है: एक पट्टी के अंतिम तत्व को दोहराते हुए और अगली पट्टी का पहला तत्व शून्य क्षेत्र के साथ 2 त्रिकोण बनाता है, इस प्रकार यह कुछ भी नहीं खींचता है। दूसरी तिमाही सूचकांकों पर विचार करें (4, 5, 6, 7)। दो क्वैड के GL_TRIANGLE_STRIP के लिए सूचकांक बफर हो सकता है: {0, 1, 2, 3, 3, 4,4, 5, 6, 7}। पतित त्रिकोण हैं 3,3,4और 3,4,4। क्या यह करने योग्य है? नहीं, जब तक कि आपके क्वाड्स सामान्य किनारों के साथ जोड़े (या अधिक) में नहीं आते हैं। यदि 2nd क्वाड {3, 2, 4, 5} है तो स्ट्रिप है {0,1,3,2,5,4}
टूलमेकरसैट

8
और जो भी साथ आता है उसे यह स्पष्ट करने के लिए और quads का एक गुच्छा खींचने की आवश्यकता है: प्रदर्शन के लिए, उपरोक्त कोड की प्रतिलिपि न करें , और एक ग्लैडरेवल्स कॉल को EACH QUAD के लिए ONCE करें । इसके बजाय, एक कोने सरणी और एक सूचक सरणी का निर्माण करें जिसमें वे सभी quads शामिल हैं जिन्हें आप आकर्षित करना चाहते हैं। GL_TRIANGLES का उपयोग करते हुए, दो क्वैड इंडेक्स {0,1,2, 0,2,3, 4,5,6, 4,6,7}या समान रूप से अच्छे हो सकते हैं {0,1,2, 2,3,0, 4,5,6, 6,7,4}। यह मदद करने के लिए अच्छा वर्ग है glText-Android / SpriteBatch
ToolmakerSteve

6

इंडेक्स डॉक्स में इंगित किए गए इंडेक्स बफ़र्स का उपयोग करना आवश्यक रूप से तेज़ नहीं है , "सर्वश्रेष्ठ प्रदर्शन के लिए, आपके मॉडल को glDrawArrays का उपयोग करते हुए एकल unindexed त्रिकोण पट्टी के रूप में प्रस्तुत किया जाना चाहिए"

तो, जबकि GL_TRIANGLE_STRIPयह एक सूचकांक बफर की आवश्यकता के बिना 4 कोने में करेगा, और आप एक सूचकांक बफर का उपयोग कर सकते हैं, यह 2 शीर्षकों को दोहराते हुए "बचाने" का प्रयास करने के लिए बहुत लंगड़ा है । इस कारण से, मेरा सुझाव है कि आप 2 अलग-अलग ड्रा करें GL_TRIANGLESऔर विकर्ण पर 2 कोने दोहराएं


8
उम नहीं। उस डॉक्टर का कहना है कि आपके मॉडल को एक एकल सूचकांक त्रिकोण पट्टी के रूप में प्रस्तुत किया जाना चाहिए। और बहुत ही अगला वाक्य है, "वर्टेक्स बफर में एक ही वर्टेक्स के लिए कई बार डेटा निर्दिष्ट करने से बचने के लिए, एक अलग इंडेक्स बफर का उपयोग करें और glDrawElements फ़ंक्शन का उपयोग करते हुए त्रिकोण स्ट्रिप खींचें"। जो आपने तय किया वही 'लंगड़ा' था।
davidf2281

3
यह देखते हुए कि डॉक्टर अनुच्छेद अब glDrawArays के बजाय glDrawElements को संदर्भित करता है, यह संभवतः इस उत्तर के बाद से फिर से लिखा गया है। फिर भी, बिंदु जिस बिंदु पर बना था, वह था, प्रदर्शन के लिए, एक एकल पट्टी (कई स्ट्रिप्स के बजाय, इसलिए कई ग्ल कॉल) की आपूर्ति । इस स्थिति में, मेरा मानना ​​है कि सूचकांकों का उपयोग करने या न करने के बीच का अंतर नगण्य है ; क्या मायने रखती है सब कुछ एक ही शीर्ष सरणी (प्लस एक वैकल्पिक सूचकांक सरणी) में हो रही है, ताकि आप एक एकल कॉल कर सकें।
टूलमेकरसेव

0

डेस्कटॉप पर बड़ा लाभ GL_STATIC_DRAW VBOs में डेटा को स्थानांतरित करना है। संभवतः iPhone के MBX GPU पर भी यह सच है।


-2

GL_TRIANGLE_FANएक क्वाड के लिए 4 वर्टिकल का उपयोग करते हुए , 6 नहीं।


हां, लेकिन ऐसा होता है GL_TRIANGLE_STRIP, जैसा कि अन्य उत्तर पहले ही बता चुके हैं।
एको

@श्री। ब्लाह - आप प्रश्न के बिंदु से चूक गए हैं, जो कि कैसे कुशलतापूर्वक quads का एक गुच्छा है। प्रत्येक क्वाड के लिए एक ग्ल कॉल नहीं करना चाहिए, बल्कि बहुत सारे क्वास को एक ही एरे में संयोजित करना चाहिए, जो कि सिंगल ग्ल कॉल के साथ तैयार किया जा सकता है। GL_TRIANGLE_FAN इससे मदद नहीं करेगा, इसलिए उच्च-प्रदर्शन प्रतिपादन में यह शायद ही उपयोगी है।
टूलमेकरसैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.