2013-04-24 94 views
5

我在寫一個特定的OpenGL應用程序,我特別喜歡逐幀繪製幀。爲此,我想禁用自動清除緩衝區,我明白,是GLSurfaceView.Renderer.onDrawFrame()的默認行爲。有人可以幫助我如何做到這一點?我需要用Java編寫應用程序,而不是使用本機SDK。在Android上使用OpenGL時自動清除緩衝區

我明白,我可能會因這樣做: - :

"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)的問題是,我的應用程序簡單地崩潰的時候,我打電話EGL14的任何方法,我不知道我應該如何使用它(我找不到一個示例程序/教程如何EGL14應該用於應用程序)。特別是,我想學習如何從EGL14中獲得有效的GL上下文:對於EGL10,我可以通過調用javax.microedition.khronos.egl.EGLContext.getGL()來實現。但是,我沒有在類android.opengl.EGLContext中看到等價的方法。實際上,除了EGL14之外,android.opengl中所有與EGL相關的類似乎都是空的。

我最好的選擇是跟隨推理的同一行中GLES20的情況:只能撥打內部GLSurfaceView.Renderer方法的方法:onDrawFrame(),onSurfaceCreated(),onSurfaceChanged(),因爲這些供應有效GL (GL10)和EGL(EGLConfig)上下文作爲參數。所以我把下面的內部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 2013-08-04 12:52:55

回答

0

而不是直接使用EGL的,你可以擴展GLSurfaceView並調用初始化 setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

此設置可防止GLSurfaceView幀從正在重繪,直到調用requestRender(),這是該示例應用程序更高效。

查看關於如何使用Java設置GLES的android docs 1

Building an OpenGL ES Environment

+1

感謝您的回覆,但是我認爲您誤解了我的問題。 我不希望控制何時繪製新框架(連續或按需)。我想要的是,當繪製新框架時,它不應該自動清除前一幀的內容(因爲是onDrawFrame()的默認行爲)。換句話說,已經在一個幀中繪製的內容應該被保留,並且隨後的幀應該被繪製在前一幀的頂部。 – 2013-04-29 05:23:58

+0

你可以重寫onDrawFrame什麼都不做?如果它的默認行爲是調用glClear。 – torbjoernwh 2013-04-29 16:03:57

1

實現可能比您正在使用的接口更高的EGL版本。實際版本由EGL10.eglInitialize()返回。如果它是[1,4]或更高,則在調用EGL10.eglChooseConfig()時可以傳遞[EGL10.EGL_SURFACE_TYPE,EGL14.EGL_SWAP_BEHAVIOR_PRESERVED_BIT]。可以在這裏使用EGL_SWAP_BEHAVIOR_PRESERVED_BIT的EGL14定義 - 它只是EGL規範定義的一個int。

EGL14.eglGetDisplay()如何使應用程序崩潰。它拋出一個沒有被捕獲的異常嗎?可能值得在https://code.google.com/p/android/issues/list處提交一個錯誤(關於你在做什麼以及在什麼設備上的詳細信息)。

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()); 

然後,在impl您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); 
}