2013-04-24 11 views
5

पर ओपनजीएल का उपयोग करते समय स्वचालित बफर स्पष्ट है, मैं एक निश्चित ओपनजीएल एप्लिकेशन लिख रहा हूं जहां मैं विशेष रूप से फ्रेम को क्रमशः आकर्षित करना चाहता हूं। इसके लिए, मैं बफर के स्वचालित समाशोधन को अक्षम करना चाहता हूं जो मैं समझता हूं, GLSurfaceView.Renderer.onDrawFrame() का डिफ़ॉल्ट व्यवहार है। क्या कोई मेरी मदद कर सकता है कि यह कैसे करें? मुझे देशी एसडीके का उपयोग न करने पर जावा में एप्लिकेशन लिखना होगा।Android

मैं समझता हूँ कि मैं संभवतः कर ऐसा कर सकता है: -:

"EGL_SWAP_BEHAVIOR_PRESERVED_BIT are supported only if the EGL version is 1.4 or greater." 
"EGL_SWAP_BEHAVIOR is supported only if the EGL version is 1.2 or greater." 

अब, मैं समझता हूँ कि मैं में EGL यहां पहुंच सकता है -

(1) setting EGL_SWAP_BEHAVIOR_PRESERVED_BIT bit for EGL_SURFACE_TYPE attribute while doing [eglChooseConfig][1](), and 
(2) setting EGL_SWAP_BEHAVIOR attribute to EGL_BUFFER_PRESERVED by calling [eglSurfaceAttrib][2] on the EGLSurface object 

हालांकि, मैं Khronos दस्तावेज़ जिसे से इकट्ठा मेरी Android एप्लिकेशन में दो तरीके: -

(1) use the Khronos API class [EGL10][3] in javax.microedition.khronos.egl package (EGL11 doesn't seem to be implemented yet) 
(2) use the Android API class [EGL14][4] in android.opengl package (similar to using class android.opengl.GLES20) 

साथ समस्या यह है (1) है कि संस्करणहै1.4 इसलिए यह मुझे आवश्यक कार्यक्षमता का समर्थन नहीं करता है। समस्या (2) है कि मेरा एप्लिकेशन बस उस क्षण को क्रैश करता है जब मैं ईजीएल 14 में किसी भी विधि को कॉल करता हूं, और मुझे यकीन नहीं है कि मुझे इसका उपयोग कैसे करना है (मुझे एक उदाहरण उदाहरण/ट्यूटोरियल कैसे नहीं मिला ईजीएल 14 को ऐप में इस्तेमाल किया जाना चाहिए)। विशेष रूप से, मैं सीखना चाहता हूं कि ईजीएल 14 से वैध जीएल संदर्भ कैसे प्राप्त करें: ईजीएल 10 के मामले में, मैं javax.microedition.khronos.egl.EGLContext.getGL() को कॉल करके ऐसा कर सकता हूं। हालांकि, मुझे कक्षा android.opengl.EGLContext में कोई समकक्ष विधि नहीं दिखाई देती है। वास्तव में, ईजीएल 14 को छोड़कर android.opengl में सभी ईजीएल से संबंधित वर्ग अधिकतर खाली होते हैं।

मेरी सबसे अच्छी शर्त जीएलएस 20 के मामले में तर्क की एक ही पंक्ति का पालन करना था: केवल GLSurfaceView.Renderer विधियों के अंदर विधियों को कॉल करने के लिए: ऑन ड्राफ्रेम(), ऑनफुरसक्रेटेड(), ऑनफुरस चेंटेड(), क्योंकि इन आपूर्ति मान्य जीएल (जीएल 10) और ईजीएल (ईजीएलकोनफिग) तर्क के रूप में संदर्भित करता है। इसलिए मैं onDrawFrame अंदर कोड निम्नलिखित रख(): -

public void onDrawFrame(GL10 gl) 
{ 
    ... 
    android.opengl.EGLDisplay d = null; 
    if ((d = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)) == EGL14.EGL_NO_DISPLAY) { 
     Log.i("Triangle", "EGL14.eglGetDisplay() failed!"); 
    } else { 
     Log.i("Triangle", "EGL14.eglGetDisplay() succeeded!"); 
    } 
    ... 
} 

मेरा मानना ​​है कि मैंने ऊपर बुला के बाद से सभी तरीकों स्थिर हैं पहले EGL14 का दृष्टांत नहीं करना पड़ेगा। हालांकि, EGL14.eglGetDisplay() को कॉल ऐप को क्रैश करता है।

किसी भी मदद की बहुत सराहना की जाएगी, धन्यवाद :)

+0

हैलो, मैं एक ही समस्या का सामना करना पड़ रहा था, और मैं सिर्फ बाहर पाया है कि अपनी समस्या से "glColorMask" एक फोन था , इस विधि को मेरी कॉल हटाने के बाद सब कुछ हल हो गया। शायद आपकी समस्या का कारण अलग है, लेकिन अगर यह आपकी मदद करता है तो मैं आपको संकेत देता हूं। – PerracoLabs

उत्तर

0
इसके बजाय EGL सीधे का उपयोग करने का

, आप GLSurfaceView का विस्तार करने और init पर setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); कह सकते हैं।

यह सेटिंग GLSurfaceView फ्रेम को फिर से खींचा जाने से रोकती है जब तक कि आप requestRender() को कॉल न करें, जो इस नमूना ऐप के लिए अधिक कुशल है।

जावा के साथ जीएलएस सेट करने के तरीके पर एंड्रॉइड दस्तावेज़ 1 देखें।

Building an OpenGL ES Environment

+1

उत्तर के लिए धन्यवाद, हालांकि मुझे लगता है कि आपने मेरे प्रश्न को गलत समझा। जब नया फ्रेम खींचा जाता है (लगातार या मांग पर) मैं नियंत्रण नहीं करना चाहता हूं। मैं क्या चाहता हूं, जब नया फ्रेम खींचा जाता है, तो इसे पिछले फ्रेम की सामग्री को स्वचालित रूप से साफ़ नहीं करना चाहिए (जैसा कि ड्रॉफ्रेम() पर डिफ़ॉल्ट व्यवहार है)। दूसरे शब्दों में, पहले से ही एक फ्रेम में खींची गई सामग्रियों को बनाए रखा जाना चाहिए, और बाद के फ्रेम को पिछले फ्रेम के शीर्ष पर खींचा जाना चाहिए। –

+0

क्या आप कुछ भी करने के लिए ड्रॉफ्रेम पर ओवरराइड कर सकते हैं? यदि इसका डिफ़ॉल्ट व्यवहार glClear को कॉल करना है। – torbjoernwh

1

EGL संस्करण कार्यान्वित इंटरफ़ेस का उपयोग कर रहे तुलना में अधिक हो सकता है। वास्तविक संस्करण EGL10.eglInitialize() द्वारा वापस किया जाता है। यदि यह [1,4] या उच्चतर है, तो आप EGL10.eglChooseConfig() को कॉल करते समय [EGL10.EGL_SURFACE_TYPE, EGL14.EGL_SWAP_BEHAVIOR_PRESERVED_BIT] पास कर सकते हैं। EGL_SWAP_BEHAVIOR_PRESERVED_BIT की EGL14 परिभाषा का उपयोग करना ठीक है - यह केवल ईजीएल स्पेक द्वारा परिभाषित एक int है।

EGL14.eglGetDisplay() ऐप को कैसे क्रैश करता है। क्या यह एक अपवाद फेंक रहा है जो पकड़ा नहीं जा रहा है?https://code.google.com/p/android/issues/list पर एक बग दर्ज करने के लायक हो सकता है (आप क्या कर रहे हैं, और किस डिवाइस पर) के बारे में अधिक जानकारी के साथ।

0

आप बस render to texture कर सकते हैं और फिर उस बनावट को स्क्रीन पर खींच सकते हैं।

0

जेसी हॉल के समाधान का निर्माण करने के लिए:

import javax.microedition.khronos.egl.EGL10; 
import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.egl.EGLDisplay; 
import android.opengl.EGL14; 

आप अपने GLSurfaceView उपवर्ग में एक आंतरिक वर्ग कि एक EGLConfigChooser लागू करता है हो सकता है:

private static class MyEGLConfigChooser implements GLSurfaceView.EGLConfigChooser { 
    public EGLConfig chooseConfig (EGL10 egl, EGLDisplay display) { 
     EGLConfig [] configs = new EGLConfig[1]; 
     int [] num_config = new int[1]; 
     int [] attrib_list = new int[] { 
      EGL10.EGL_RED_SIZE, 8, 
      EGL10.EGL_GREEN_SIZE, 8, 
      // ... + anything else you want ... 
      EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT | EGL14.EGL_SWAP_BEHAVIOR_PRESERVED_BIT, 
      EGL10.EGL_NONE, 
     }; 

     if (egl.eglChooseConfig(display, attrib_list, configs, configs.length, num_config) && num_config[0] > 0) { 
      // We just pick the first here, but you could interrogate all 
      return configs[0]; 
     } 

     return null; 
    } 
} 

GLSurfaceView उपवर्ग के अपने निर्माता में, जोड़ें:

setEGLConfigChooser(new MyEGLConfigChooser()); 

फिर, प्रत्यारोपण में अपने GLSurfaceView.Renderer, जब भी सतह परिवर्तन, आप उस पर गुण सेट कर सकते हैं की ementation:

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    EGL14.eglSurfaceAttrib(EGL14.eglGetCurrentDisplay(), 
          EGL14.getCurrentSurface(EGL14.EGL_DRAW), 
          EGL14.EGL_SWAP_BEHAVIOR, 
          EGL14.EGL_BUFFER_PRESERVED); 
} 

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