2013-04-24 4 views
5

필자는 구체적으로 프레임을 점진적으로 그려야하는 특정 OpenGL 응용 프로그램을 작성하고 있습니다. 이를 위해 GLSurfaceView.Renderer.onDrawFrame()의 기본 동작 인 자동 버퍼 지우기 기능을 비활성화하고 싶습니다. 누군가가 나를 어떻게 도와 주실 수 있습니까? 네이티브 SDK를 사용하지 않고 Java로 응용 프로그램을 작성해야합니다.안드로이드에서 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 

는 그러나, 나는 크로노스의 문서에서 수집 내 안드로이드 응용 프로그램에서 두 가지 방법 : -

(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 관련 클래스는 대부분 비어있는 것 같습니다.

가장 좋은 방법은 GLSurfaceView.Renderer 메서드 내에서만 메서드를 호출하는 것과 동일한 추론을 따르는 것이 었습니다. onDrawFrame(), onSurfaceCreated(), onSurfaceChanged() (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()를 호출하면 응용 프로그램이 충돌합니다.

어떤 도움이 많이 주시면 감사하겠습니다, 감사합니다 :) 대신 직접 EGL을 사용

+0

안녕하세요, 저도 같은 문제에 직면하고 있었다 난 그냥 내 문제는 전화로 "glColorMask"것을 발견했습니다 ,이 메서드에 내 전화를 제거한 후 모든 것이 해결되었습니다. 아마 당신의 이슈의 원인은 다를 수 있습니다 만, 그게 도움이 될지 모르겠지만 나는 당신에게 힌트를 드리겠습니다. – PerracoLabs

답변

0

, 당신은 GLSurfaceView를 확장하고 초기화에 setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);를 호출 할 수 있습니다.

이 설정을 사용하면이 샘플 응용 프로그램에서보다 효율적인 requestRender()를 호출 할 때까지 GLSurfaceView 프레임이 다시 그려지지 않습니다.

Java로 GLES를 설정하는 방법은 android docs 1을 참조하십시오.

Building an OpenGL ES Environment

+1

답장을 보내 주셔서 감사합니다. 그러나 제 질문에 대해 오해 한 것 같습니다. 새 프레임을 그릴시기를 (연속적으로 또는 필요에 따라) 제어하고 싶지 않습니다. 원하는 것은 새로운 프레임이 그려지면 onDrawFrame()의 기본 동작처럼 이전 프레임의 내용을 자동으로 지워서는 안됩니다. 즉, 이미 한 프레임에 그려진 내용을 유지해야하고 그 다음 프레임을 이전 프레임 위에 그려야합니다. –

+0

아무것도하지 않으려면 onDrawFrame을 재정의 할 수 있습니까? 기본 동작이 glClear를 호출하는 것입니다. – torbjoernwh

1

사용하고있는 인터페이스보다 더 높을 수 있습니다 구현 된 EGL 버전. 실제 버전은 EGL10.eglInitialize()에 의해 반환됩니다. [1,4] 이상인 경우 EGL10.eglChooseConfig()를 호출 할 때 [EGL10.EGL_SURFACE_TYPE, EGL14.EGL_SWAP_BEHAVIOR_PRESERVED_BIT]을 전달할 수 있습니다. 여기 EGL_SAWAP_BEHAVIOR_PRESERVED_BIT의 EGL14 정의를 사용하는 것은 괜찮습니다. 이것은 단지 EGL 스펙에 정의 된 int입니다.

어떻게 EGL14.eglGetDisplay()가 응용 프로그램을 중단시킵니다. 잡히지 않는 예외를 던지고 있습니까?https://code.google.com/p/android/issues/list에 버그를 신고 할 가치가있을 것입니다 (수행중인 작업에 대한 세부 정보와 장치의 세부 정보 포함).

0

간단히 render to texture을 입력하고 해당 텍스처를 화면에 그릴 수 있습니다.

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

당신은 EGLConfigChooser 구현하여 GLSurfaceView 서브 클래스의 내부 클래스 가질 수 있습니다 : 제시 홀의 솔루션에 구축하기

0

GLSurfaceView 서브 클래스의 생성자에서

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; 
    } 
} 

를 추가 :

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