2011-05-08 3 views
20

developer.android.com에서 제공하는 GLES20 샘플을 사용할 때 "호출되지 않은 OpenGL ES API"오류가 발생합니다. 하지만 샘플을 수정했습니다. 내가 GLSurfaceView.BaseConfigChooser.chooseconfig에 IllegalArgumentException를 가지고 때문에 이유는, 그래서 나는 새로운 OnCreateMethod mGLSurfaceView.setEGLContextClientVersion(2);Android : GLES20 : ​​구현되지 않은 OpenGL ES API로 호출 됨

를 교체하십시오 "호출 구현되지는 OpenGL ES API를"오류가에서 예를 들어 발생

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    mGLSurfaceView = new GLSurfaceView(this); 

    mGLSurfaceView.setEGLConfigChooser(new EGLConfigChooser() 
    { 
     @Override 
     public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) 
     { 
      EGLConfig[] configs = new EGLConfig[1]; 
      int[] num_config = new int[1]; 

      boolean check = false; 

      int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE }; 

      check = egl.eglInitialize(display, new int[] { 2, 0 }); 

      if (!check) 
       return null; 
      check = false; 

      check = egl.eglChooseConfig(display, configSpec, configs, 1, num_config); 
      if (!check) 
       return null; 

      return configs[0]; 
     } 
    }); 

    mGLSurfaceView.setEGLContextFactory(new EGLContextFactory() 
    { 
     @Override 
     public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) 
     { 
      egl.eglDestroyContext(display, context); 
     } 

     @Override 
     public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) 
     { 
      int[] attrib_list = new int[]{EGL10.EGL_VERSION, 2, EGL10.EGL_NONE}; 

      EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list ); 
      return context; 
     } 
    }); 

    mGLSurfaceView.setRenderer(new GLES20TriangleRenderer(this)); 

    setContentView(mGLSurfaceView); 
} 

GLES20.glCreateShader; 또는 GLES20.glShaderSource

나는 어쩌면 버전을 확인하기 위해, 생각, 그래서 나는 public void onSurfaceCreated(GL10 gl, EGLConfig config)gl.glGetString(GLES20.GL_VERSION);을했다. glGetString이 "OpenGL ES-CM 1.0"을 반환했습니다. OnSurfaceCreated는 컨피규레이션을 선택하고 컨텍스트를 생성 한 후에 호출됩니다. 그래서 정말로 이해하지 못합니다. 왜 왜 glGetString이 "OpenGL ES-CM 1.0"을 반환하는지 이해하지 못합니다.

Android 2.2 API를 사용하고 Android 2.2 가상 장치 및 Android 2.2.1이 설치된 HTC Wildfire에서 샘플을 시험해 보았습니다.

내가 어떤 도움

+1

저는 GL ES 1.1/2.0에 대해 경험이 없지만 AFAIK를 잘 구현하지 못한다는 것을 잘 알고있는 것이 좋습니다. 그리고 장치에서는 작동하지만 에뮬레이터에서는 작동하지 않는 코드로 끝날 수 있습니다. – harism

답변

1
이것은 오류가 아닙니다

하지만 문을 주셔서 감사합니다. 타겟이 OpenGL ES 버전 2.0을 지원하지 않는다는 것을 알려줍니다.

+0

좋아, 그건 논리적으로 들리 네. HTC Wildfire는 OpenGL ES 1.0 만 지원합니다. 따라서 가상 장치가 OpenGL ES 2.0을 지원하지 않는다고 가정 할 수 있습니다. 당신의 도움을 주셔서 감사합니다. – Coolkill

41

Android 앱에서 OpenGL ES 2.0을 사용하도록 설정해야합니다.

먼저, 당신의 AndroidManifest.xml에 다음과 같은했는지 확인 :

<uses-feature android:glEsVersion="0x00020000"></uses-feature> 
<uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"></uses-sdk> 

둘째이 같은 GLSurfaceView의 서브 클래스를 만들 : NDK

에 대한

public class CustomView extends GLSurfaceView { 
    final CustomRenderer renderer; 
    CustomView(Context context) { 
     super(context); 
     setEGLContextClientVersion(2); // This is the important line 
     renderer = new CustomRenderer(); 
     setRenderer(renderer); 
    } 
} 

선택 속성 및 컨텍스트 att ribute 목록 :

const EGLint attribs[] = { 
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
    EGL_BLUE_SIZE,  8, 
    EGL_GREEN_SIZE,  8, 
    EGL_RED_SIZE,  8, 
    EGL_NONE 
}; 
eglChooseConfig(dpy, attribs, &config, 1, &numConfigs); 


const EGLint ContextAttribList[] = { 
    EGL_CONTEXT_CLIENT_VERSION, 2, 
    EGL_NONE 
}; 
context = eglCreateContext(GLapp.dpy, config, EGL_NO_CONTEXT, ContextAttribList); 
+10

고마워!이것은 NDK로 작성된 앱에도 적용됩니다. 이 경우, 동등한 두 번째 단계는 EGL_CONTEXT_CLIENT_VERSION이 2로 설정된 속성 목록을 작성한 다음 eglCreateContext()로 전달하는 것입니다. – scorpiodawg

+0

@ Trevor, 그게 나를 위해 작동하지 않았다. 제발 도와 줄 수있어? 'setEGLContextClientVersion (2);'메소드에서 에러가 발생했습니다 : 여기 [activity] (https://gist.github.com/doctordoder/7494621)입니다, 여기 내 [렌더러] (https : //gist.github.com/doctordoder/7494625) 여기에 내 [manifest] (https://gist.github.com/doctordoder/7494625)가 있습니다. javax.microedition.khronos를 사용하고있는 것을 볼 수 있습니다. 예전의'EGLConfig' 대신에 egl.EGLConfig를 사용하고 있습니다. 왜냐하면 내 IDE (intellij IDEA)가 가져온 후에도 사용하지 못하기 때문입니다. 도와 주셔서 감사합니다! – michaelsnowden

+0

원래 문제를 다시 읽었습니다 ... 불행히도 Wildfire는 OGL ES 2 (GPU가 없음)를 지원하지 않으므로 다른 장치가 필요합니다. – Trevor

2

이 게시물을 참조 - 가 언급 한 바와 같이 triangle opengl in android

는, 에뮬레이터가 GL2을 지원하지 않지만 해당 게시물 언급, 그것은 실제 장치에서 날 위해 일했습니다.

0

렌더러 구현에서 onSurfaceCreated(), onSurfaceChanged() 및 onDrawFrame()의 매개 변수로 사용중인 GL10 인스턴스를 사용하고 있기 때문일 수 있습니다. OpwnGL ES 2.0을 사용하고자하므로 인스턴스를 사용하지 않고 대신 대체 방법을 사용할 수 있습니다. 대안이 있습니다! 이것이 우리가 그 매개 변수 이름과 그물을 통해 사용하지 않거나 비슷한 코드를 보는 이유입니다!

관련 문제