2012-01-06 13 views
6

में ओपनजीएल शेडर्स बनाना, मैंने हेल्लो-ग्ल 2 उदाहरण से ओपनजीएल कोड को शामिल करने के लिए मूल गतिविधि एनडीके नमूना tweaked किया है। मैं APP_CMD_INIT_WINDOW संदेश संभालता हूं और फिर शेडर्स बनाने का प्रयास करता हूं। शेडर निर्माण विफल रहता है और मैं getShaderInfoiv के माध्यम से जानकारी प्राप्त करने का प्रयास करता हूं, लेकिन वह चुपचाप विफल रहता है।नेटिवएक्टिविटी

तो मेरा सवाल है - मैं शुद्ध देशी एंड्रॉइड एप्लिकेशन में ओपनजीएल ईएस 2.0 शेडर कैसे बना सकता हूं?

पीएस मुझे पता है कि यदि आप जावा GLSurfaceView का उपयोग करते हैं और सही धागे में नहीं बनाते हैं तो शेडर निर्माण विफल हो सकता है, लेकिन मूल गतिविधि नमूना को देखते हुए, यह केवल एक धागा प्रतीत होता है!

+0

संभावित बेकार प्रश्न के लिए खेद है, लेकिन क्या आपने किसी भी तरह से ईजीएल में प्रवेश किया? मुझे लगता है कि ओपनजीएल इंजन आपके अनुरोध प्राप्त करने के लिए तैयार नहीं है (जो getShaderInfoiv कॉल की चुप विफलता को समझा सकता है)। मामले में, ओजीएल 2.0 लाइब्रेरी लोड की गई है? –

+0

हाय, हाँ ईजीएल शुरू किया गया है –

+0

देशी ओपनजीएल विकास में कोई अनुभव नहीं होने पर मेरा अनुमान होगा कि मूल गतिविधि उदाहरण के बाद आपको OpenGL ES 1.0 संदर्भ के साथ छोड़ दिया जाएगा। हैलो-ग्ल 2 उदाहरण ओपनजीएल ईएस 2.0 कॉन्फ़िगरेशन चुनने में जावा कोड के भीतर किया जाता है। – harism

उत्तर

12

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

चूंकि मेरे पास जावा कोड में प्रवेश बिंदु था (नेटिव एविविटी तंत्र का उपयोग नहीं किया गया था) मुझे मूल कोड में ईजीएल सतह बनाने के लिए जावा से सी ++ में देशी विंडो हैंडल (EGLNativeWindowType) पास करना पड़ा। हालांकि, चूंकि आप मूल एक्टिविटी उदाहरण को बस संशोधित करना चाहते हैं, तो आप नेटिव एक्टिविटी main.c नमूना में प्रस्तुत ईजीएल सतह बनाने के लिए engine->app->window का उपयोग कर सकते हैं।

ठीक है, मूल कोड में उचित OpenGL ES 2.0 संदर्भ कैसे बनाएं?मैंने अभी नेटिवएक्टिविटी नमूने में main.c फ़ाइल में दो बदलाव किए हैं और इसे चेक किया है।

सबसे पहले, निम्नलिखित EGL

const EGLint attribs[] = { 
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //important 
EGL_BLUE_SIZE, 8, 
EGL_GREEN_SIZE, 8, 
EGL_RED_SIZE, 8, 
EGL_NONE 
}; 

विशेषताओं eglChooseConfig(display, attribs, &config, 1, &numConfigs); में इस्तेमाल किया।

दूसरे, बाद में संदर्भ बनाने में

const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; 

इस्तेमाल किया context = eglCreateContext(display, config, NULL, attrib_list);

में मैं कोड के बाकी अपरिवर्तित छोड़ दिया है। मुझे यकीन है कि बनाने के लिए कुछ जानकारी मुद्रित कि ओपन ES 2.0 इस्तेमाल किया जा रहा है:

I/native-activity( 955): Details: [Version: OpenGL ES 2.0 1403843], [Vendor: Qualcomm], [Renderer: Adreno 205], [Extensions: GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture ... ] 

आशा है कि यह मदद करता है!

+0

धन्यवाद - यह वही लगता है जो मैं खोज रहा हूं। मैं घर लौटने पर जांच करूंगा। –

+0

उन 2 परिवर्तनों ने इसे खींचा। धन्यवाद! –

+1

मुझे खुशी है कि मैं मदद कर सकता हूं! मुझे केवल अफसोस है कि मैंने इतने देर से जवाब लिखा था कि मुझे बक्षीस नहीं मिला;) – youri

3

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

इस तरह, विशाल लाभ पोर्टेबिलिटी है। यदि आप एनडीके में सब कुछ बनाते हैं, तो आपको व्हील का फिर से आविष्कार करना होगा यदि आप अपने गेम/प्रोग्राम को आईफोन में ले जाना चाहते हैं, जबकि यदि आप सी में "कोर" और जावा में अतिरिक्त परतें रखते हैं, तो आपको केवल फिर से लिखना होगा समस्या का आसान हिस्सा।

इस तरह के समाधानों में मुझे व्यापक अनुभव है क्योंकि मेरा 3 डी इंजन (पैट्रिआ 3 डी) मूल कोड पर बनाया गया है जो एंड्रॉइड एनडीके से आईफोन ऑब्जेक्टिव सी (प्लस विंडोज/लिनक्स/मैक ओएसएक्स) से पारित किया जा सकता है। दिन के अंत में, मेरा कोड एक पूरी तरह से अनुपालन C89 + OpenGL2.0 है जो एंड्रॉइड (एंड्रॉइड एनएनडी-बिल्ड का उपयोग करके) और आईफोन (एक्ससीडीईई) पर सीधे आगे (मामूली परिवर्तन के साथ) संकलित करने में सक्षम है।

इस दृष्टिकोण के बाद, इंजन और उसी धागे पर वास्तविक ड्राइंग निष्पादित करते हैं, मुझे इसे मुख्य धागा कहते हैं।

आप अपने आवेदन में बहु धागे की जरूरत है:

एक - मुख्य एक (मुख्य) बी पर ड्राइंग रखें - जावा में नया सूत्र बनाएँ, सी में यह मत करो (जब आप अन्य प्लेटफ़ॉर्म पर पोर्ट, आप नई परत पर बहु ​​थ्रेडिंग बनाते हैं)

शेडर्स के संबंध में, इस तरह का समाधान सतह से बहुत ही आगे है और ओपनजीएल की init मानक ईजीएल लाइब्रेरी का उपयोग कर जावा द्वारा किया जाता है ।

मेरा विश्वास करो, यदि आप एक बार लिख सकते हैं और दोनों प्लेटफ़ॉर्म, एंड्रॉइड और आईफोन पर उपयोग कर सकते हैं, तो आप "ग्राहकों" संख्याओं को दोगुना करते हैं, यह ऐसा कुछ है जिसे आप अनदेखा नहीं कर सकते हैं, यह आपकी आय को संभावित रूप से दोगुना कर सकता है।

मुझे उम्मीद है कि यह किसी भी तरह से मदद करता है।

+0

यह एक बहुत अच्छी पोस्ट प्रतीत होता है लेकिन मुझे थ्रेडिंग हिस्सा नहीं मिलता है अगर मैं सी ++ 11 का उपयोग करता हूं जो बहु थ्रेड का उपयोग कर सकता है, तो पूर्ण देशी समाधान का उपयोग करना ठीक हो सकता है? क्योंकि मैं जावा इंटरफेस के साथ सी ++ व्यक्तिगत इंजन का उपयोग कर रहा हूं (मैंने जावा में सभी बनावट रखी हैं), यह साफ नहीं है। – Sung