2010-10-25 15 views
7

मैं इस बिंदु के बारे में थोड़ा उलझन में हूं।ओपनजीएल ईएस 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 में एकाधिक मेष (विभिन्न बनावट और व्यवहार के साथ) के साथ कैसे काम करें? एकाधिक कार्यक्रमों का उपयोग करना? कैसे?

उत्तर

0

जवाब के लिए धन्यवाद,

लेकिन मुझे लगता है कि आप बस अपने खुद के शब्दों को दोहराने ... ड्रा तरीकों के बारे में, कार्यक्रम सक्रिय बारे में एक, सब कुछ के बारे में।

जो भी हो।

मुद्दा यह है कि आपके शब्द मुझे एक अंतर्दृष्टि देते हैं! आपने कहा: "आपको सभी वर्टेक्स विशेषताओं और पॉइंटर्स को रीसेट करने की आवश्यकता है"।

ठीक है ... बिल्कुल रीसेट नहीं किया गया है, लेकिन मैं बनावट चक्र पर सभी वर्टेक्स विशेषताओं को अद्यतन नहीं कर रहा था, जैसे बनावट निर्देशांक। मैं केवल उन विशेषताओं को अद्यतन कर रहा था जो बदलते हैं। और जब मैंने बफर साफ़ कर दिए, तो मैंने पुराने मूल्य खो दिए।

अब मैं सभी विशेषताओं को अपडेट करना शुरू करता हूं, परिवर्तन से स्वतंत्र हूं या उनके मूल्य नहीं, सबकुछ काम करता है!

देखें, मैं पहले है क्या था:

glCreateProgram(); 
... 
glAttachShader(); 
glAttachShader(); 
... 
glLinkProgram(); 
glUseProgram(); 
... 
glGetAttribLocation(); 
glVertexAttribPointer(); 
glEnableVertexAttribArray(); 
... 
glDrawElements(); 

मैं दूसरे कार्यक्रम के लिए प्रक्रिया को दोहराया, लेकिन सिर्फ glVertexAttribPointer() कई बार कहते हैं।

अब, मेरे पास सभी विशेषताओं के लिए glVertexAttribPointer() के लिए एक कॉल है।

मुझे जो पागल हो गया वह मुद्दा है कि अगर मैंने पहले कार्यक्रम में कोड का पहला ब्लॉक हटा दिया, तो पूरा दूसरा कार्यक्रम ठीक काम करता था। यदि मैंने दूसरे प्रोग्राम में कोड का दूसरा ब्लॉक हटा दिया, तो पहले व्यक्ति ने ठीक काम किया।

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

वैसे भी, मुद्दा यह है कि अब मैं आगे बढ़ सकता हूं!

धन्यवाद

+0

क्या आप कृपया अपना उत्तर सुधार सकते हैं? मैं वास्तव में खुश हूं कि आप समझ गए: डी – MatterGoal

2

एकाधिक मैश बनाने के लिए, बस gldrawElements/glDrawArrays को कई बार कॉल करें। अगर उन मेषों को अलग-अलग शेडरों की आवश्यकता होती है, तो बस उन्हें सेट करें। एक, और केवल एक शेडर प्रोग्राम सक्रिय है।

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

बस इतना आसान है।

संबंधित मुद्दे