मैं इस बिंदु के बारे में थोड़ा उलझन में हूं।ओपनजीएल ईएस 2.0 एकाधिक मेष? (केवल वास्तविक विश्व उदाहरण)
किताबों, ब्लॉगों, मंचों और यहां तक कि ओपनजीएल चश्मे में जो कुछ भी मैंने पाया वह सब एक बहुत ही सार तकनीक के बारे में बात करते हैं। असली दुनिया के उदाहरणों के बारे में कुछ भी नहीं।
और मैं इसके साथ पागल हो रहा हूं: OpenGL ES 2.x के साथ एकाधिक ऑब्जेक्ट्स (मेष) को कैसे प्रबंधित और प्रबंधित करें?
सिद्धांत में सरल लगता है। आपके पास वर्टेक्स शेडर (vsh) और फ्रैगमेंट शेडर (एफएसएच) है, तो आप दोनों को एक प्रोग्राम (glGenProgram, glUseProgram, ...) से बांधें। प्रस्तुत करने के प्रत्येक चक्र में, वह प्रोग्राम प्रत्येक वर्टेक्स द्वारा अपना वीएसएच निष्पादित करेगा और इसके बाद उस 3 डी ऑब्जेक्ट के प्रत्येक "पिक्सेल" पर एफएसएच प्रदर्शन करेगा और आखिरकार अंतिम परिणाम बफर को भेजें (स्पष्ट रूप से प्रति-वर्टेक्स के बारे में बात किए बिना, रास्टरराइजेशन, और पाइपलाइन में अन्य कदम)।
ठीक है, सरल लगता है ...
यह सबड्रॉ समारोह (glDrawArrays या glDrawElements) के लिए एक कॉल से निकाल दिया गया है।
ठीक है फिर से।
अब चीजें मुझे उलझन में आती हैं। और यदि आपके पास प्रस्तुत करने के लिए कई ऑब्जेक्ट हैं?
चलिए वास्तविक दुनिया के उदाहरण के बारे में बात करते हैं। कल्पना कीजिए कि आपके पास पेड़, और एक चरित्र के साथ एक परिदृश्य है। परिदृश्य के घास में एक बनावट है, पेड़ों में ट्रंक और पत्तियों (बनावट एटलस) के लिए बनावट है और आखिरकार चरित्र में एक और बनावट (बनावट एटलस) है और यह भी एनिमेटेड है।
इस दृश्य की कल्पना करने के बाद, मेरा प्रश्न सरल है: आप इसे कैसे व्यवस्थित करते हैं?
आप दृश्य पर प्रत्येक तत्व के लिए एक अलग प्रोग्राम (एक वीएसएच और एफएसएच के साथ) बनाते हैं? घास और मिट्टी की राहत के लिए एक कार्यक्रम की तरह, पेड़ के लिए एक कार्यक्रम और चरित्र के लिए एक कार्यक्रम की तरह?
मैंने कोशिश की है, लेकिन ... जब मैं कई प्रोग्राम बनाता हूं और glVertexAttribPointer() का उपयोग करने की कोशिश करता हूं, तो वस्तुओं के बनावट और रंग एक-दूसरे के साथ संघर्ष में प्रवेश करते हैं। चूंकि गुणों का स्थान, पहले कार्यक्रम में इंडेक्स, दूसरे कार्यक्रम में दोहराना है।
मुझे समझाएं, मैंने एक वर्ग में glGetAttribLocation() का उपयोग किया जो दृश्य की मंजिल को नियंत्रित करता है, इसलिए ओपनजीएल कोर वर्टेक्स विशेषताओं के लिए 0,1 और 2 की अनुक्रमणिका में लौट आया। पेड़ों की कक्षा में मैंने एक और कार्यक्रम बनाया, एक और शेडर्स, और फिर इस बार glGetAttribLocation() का उपयोग करने के बाद ओपनजीएल कोर रिटर्न 0, 1, 2 और 3 के सूचकांक के साथ।
प्रस्तुत करने के बाद चक्र, मैंने glUseProgram() के साथ पहला प्रोग्राम सेट करना शुरू कर दिया है और मैंने glvertexAttribPointer() और अंत में glDrawElements() के लिए एक कॉल के साथ अपने चरम विशेषताओं में परिवर्तन किए हैं। इसके बाद, दूसरे प्रोग्राम में glUseProgram() को दोबारा कॉल करें और glvertexAttribPointer() को फिर से और अंत में glDrawElements() का उपयोग करें। लेकिन इस बिंदु पर, चीजें विवादों में प्रवेश करती हैं, क्योंकि दूसरे कार्यक्रम के वर्टेक्स गुणों की अनुक्रमणिका पहले कार्यक्रम के कशेरुक को भी प्रभावित करती है।
मुझे बहुत सी चीजों की कोशिश की गई है, बहुत कुछ पता चला है, बहुत कुछ पूछा ... मैं थक गया हूं। मुझे नहीं पता कि क्या गलत है।
तो मुझे लगता है कि मैं सबकुछ गलत कर रहा हूं!
अब मैं फिर से अपना प्रश्न दोहराता हूं: OpenGL ES 2.x में एकाधिक मेष (विभिन्न बनावट और व्यवहार के साथ) के साथ कैसे काम करें? एकाधिक कार्यक्रमों का उपयोग करना? कैसे?
क्या आप कृपया अपना उत्तर सुधार सकते हैं? मैं वास्तव में खुश हूं कि आप समझ गए: डी – MatterGoal