3D रेंडरिंग में सूचकांकों का उद्देश्य क्या है?


11

मान लीजिए कि आप ओपनजीएल में एक 3 डी क्यूब बना रहे थे। आप ऑब्जेक्ट (क्यूब) के लिए आवश्यक शीर्ष डेटा लागू करते हैं। सूचकांकों का उपयोग करने की बात क्या होगी?

v

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

उपरोक्त उदाहरण में, विश्व अंतरिक्ष में आवश्यक चक्कर के साथ एक क्यूब बनाया जाता है। सूचकांकों के लिए प्रासंगिकता क्या है?


1
कई जगहों पर आप लोगों को उन्हें चेहरे कहते हुए देखेंगे। और यही वे हैं। प्रत्येक चेहरे को आम तौर पर त्रिभुज बनाने के लिए 3 कोने द्वारा रचा जाता है। इसलिए, प्रत्येक 3 सूचकांक अंतिम जाल में एक त्रिकोण के अनुरूप हैं। उन्हें सूचकांक कहा जाता है क्योंकि वे मुख्य रूप से उस स्थान से दूर हैं जहां वास्तविक शीर्ष जानकारी वर्टेक्स सरणी में है। इसके सभी सूचकांकों के बारे में आपको पता होना चाहिए, मुझे लगता है :)
ग्रिम्सहाव

जवाबों:


24

3 डी मॉडल का प्रतिनिधित्व करने के लिए आवश्यक मेमोरी फुटप्रिंट को कम करने के लिए इंडिक्स मौजूद हैं, उसी तरह से कि रंग पैलेट का उपयोग 2 डी इमेज के मेमोरी फुटप्रिंट को कम करने के लिए किया जा सकता है।

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

आधुनिक 3D APIs त्रिकोण का उपयोग करके प्रस्तुत करते हैं; घन के प्रत्येक चेहरे को दो त्रिकोणों की आवश्यकता होती है:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

सूचकांक के बिना उस चेहरे को निर्दिष्ट करने के लिए, आपको कोने को निर्दिष्ट करना होगा A, B, D, A, D, C। वर्टेक्स बफर में दो कोने ( Aऔर D) दोहराए जाते हैं।

हालांकि, सूचकांक के साथ, आप केवल आवश्यक कोने (युक्त एक शीर्ष बफर हो सकता है A, B, C, और D) और छह सूचकांक: 0, 1, 3, 0, 3, 2। चूँकि सूचकांक आम तौर पर कोने की तुलना में बहुत छोटे होते हैं और कई कोने आम तौर पर व्यावहारिक मॉडल में दोहराते हैं, यह एक महत्वपूर्ण स्थान-बचत हो सकती है।

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

यदि वास्तव में आपके सभी जाली कोने 100% अलग हैं, तो सूचकांकों के लिए कोई लाभ नहीं है (वास्तव में आप निरर्थक सूचकांक बफर की खपत में अधिक स्थान का उपयोग करेंगे)। हालांकि, यह हमेशा नहीं होता है।


1
क्या इसके बजाय 0,1,3, 0,1,2 होना चाहिए?
सैड CRUD डेवलपर

0, 1, 3, 0, 3, 2 वास्तव में, धन्यवाद (आधारित ए = 0, बी = 1, सी = 2, डी = 3)। मैंने जवाब अपडेट किया।

शायद यह ध्यान देने योग्य है, कि एक त्रिकोण जाल पर त्रिकोण के औसत संख्या जो कि एक शीर्ष से सटे हैं 6.
Arne

7

सूचकांकों का उपयोग तीन मुख्य उद्देश्यों को पूरा करता है:

  • मूल जाल से हटाए जाने वाले डुप्लिकेट वर्सेट्स को सक्षम करके मेमोरी आवश्यकताओं को कम करना।
  • केवल एक बार रूपांतरित होने के लिए डुप्लिकेट वर्सेट्स को सक्षम करके वर्टेक्स शेडर गणनाओं को कम करना।
  • समवर्ती प्राइमेटिव्स जिससे आप ड्रॉ कॉल्स को कम कर सकते हैं।

इनमें से पहला स्पष्ट है क्योंकि आप इसे सीधे अपने कोड में माप सकते हैं: यदि कोई जाली थी, तो कहो, 50k वर्टिकल लेकिन अगर उनमें से 30k डुप्लिकेट थे, तो आप एक मेमोरी सेविंग हैं।

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

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

तीसरे के लिए, आपके द्वारा किए गए प्रत्येक ड्रॉ कॉल में एक सीपीयू ओवरहेड होता है, भले ही इसके लिए कितने जीपीयू काम करने की आवश्यकता हो। यदि सब कुछ समान है, तो 1k कॉल में 50k का जाल खींचना 10k ड्रा कॉल में ड्राइंग करने की तुलना में बहुत तेज होने वाला है। लेकिन अगर आपका जाल कई स्ट्रिप्स से बना है, या (और भी बदतर) स्ट्रिप्स और प्रशंसकों का एक संयोजन है, तो आप इसे (1) इंडेक्स का उपयोग किए बिना एक ड्रॉ कॉल में नहीं कर सकते हैं, या (2) पतित त्रिकोण को शुरू कर सकते हैं। लेकिन क्योंकि सूचकांक सामान्य से बहुत छोटे होते हैं, सामान्य स्थिति में सूचकांक का उपयोग करना पसंद किया जाता है।


0

सूचक कहते हैं कि तीन कोणों के समूह मिलकर क्यूब के चेहरे बनाते हैं। त्रिभुज के तीन कोणों का प्रत्येक सेट त्रिभुज के चेहरे नहीं हैं।

आप प्रत्येक वर्टेक्स का एक बार उपयोग कर सकते हैं, और बस कई बार दोहराएं जो एक त्रिकोण से अधिक में उपयोग किए जाते हैं, लेकिन इसका मतलब होगा कि अतिरिक्त वर्टेक्स रूपांतरित होता है। सूचकांकों के साथ आप सिर्फ़ एक बार ही कायापलट करते हैं और जितनी बार ज़रूरत होती है, उनका उपयोग करते हैं।


जब आप त्रिकोण का मतलब ??
सैड CRUD डेवलपर

आधुनिक ग्राफिक्स हार्डवेयर सब कुछ त्रिकोण के रूप में प्रस्तुत करता है।

1
यदि आप वास्तव में समझना चाहते हैं कि क्या चल रहा है, तो कुछ ग्राफ पेपर प्राप्त करें, 3 डी कोने खींचें, और इंडिसेस द्वारा निर्दिष्ट कोने के बीच की रेखाएं खींचें।
ggambett
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.