2011-05-08 10 views
20

estoy recibiendo un error de "Llamada sin aplicarse API de OpenGL ES", cuando se trata de la Muestra GLES20, proporcionada por developer.android.com. Aunque modifiqué la muestra. La razón fue porque Tengo una IllegalArgumentException en GLSurfaceView.BaseConfigChooser.chooseconfig, así que reemplazó mGLSurfaceView.setEGLContextClientVersion(2);Android: GLES20: Llamado sin aplicarse API de OpenGL ES

El nuevo OnCreateMethod:

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

Se produce el error "Llamado sin aplicarse API de OpenGL ES", por ejemplo en GLES20.glCreateShader; o GLES20.glShaderSource.

pensé, tal vez para comprobar la versión, por lo que llamó gl.glGetString(GLES20.GL_VERSION); en public void onSurfaceCreated(GL10 gl, EGLConfig config). glGetString devolvió "OpenGL ES-CM 1.0". Se llama a OnSurfaceCreated después de elegir la configuración y crear el contexto, así que realmente no entiendo por qué glGetString devuelve "OpenGL ES-CM 1.0".

estoy usando Android 2.2 API y trató la muestra en un 2,2 dispositivo virtual Android y en un reguero de pólvora, con Android 2.2.1.

Agradezco cualquier ayuda

+1

No estoy muy experimentado con GL ES 1.1/2.0 pero es mejor que mucho emulador conscientes no implementa ellos muy bien que yo sepa. Y puede terminar con un código que funciona en el dispositivo pero no en el emulador. – harism

Respuesta

1

Esto no es un error, sino una afirmación. Simplemente le dice que su objetivo no es compatible con OpenGL ES versión 2.0.

+0

Ok, eso suena lógicamente. El HTC Wildfire solo tiene soporte para OpenGL ES 1.0. Así que puedo suponer que los dispositivos virtuales no son compatibles con OpenGL ES 2.0. Gracias por tu ayuda. – Coolkill

41

necesita habilitar OpenGL ES 2.0 en su aplicación para Android.

En primer lugar, en su AndroidManifest.xml, asegúrese de tener lo siguiente:

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

En segundo lugar, crear una subclase de GLSurfaceView así:

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

PARA NDK

Asegúrate de elegir el atributo y el contexto att listas 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

Gracias!Esto también funciona para aplicaciones escritas con el NDK. En ese caso, el segundo paso equivalente es crear una lista de atributos con EGL_CONTEXT_CLIENT_VERSION establecida en 2 y luego pasarla a eglCreateContext(). – scorpiodawg

+0

@Trevor, eso no funcionó para mí. ¿Me puede ayudar por favor? Estoy obteniendo un error del método 'setEGLContextClientVersion (2);': Aquí está la [actividad] (https://gist.github.com/doctordoder/7494621), aquí está la clase para mi [renderizador] (https: //gist.github.com/doctordoder/7494625), y aquí está mi [manifiesto] (https://gist.github.com/doctordoder/7494625). Es posible que notes que estoy usando 'javax.microedition.khronos. egl.EGLConfig' en lugar del simple viejo 'EGLConfig' y eso es porque mi IDE (intellidia IDEA) no me dejaba usarlo incluso después de la importación. ¡Gracias por ayudar! – michaelsnowden

+0

Releí su problema original ... desafortunadamente, Wildfire no es compatible con OGL ES 2 (no tiene una GPU) por lo que necesitará un dispositivo diferente. – Trevor

2

vea este post - triangle opengl in android

Como se menciona allí, los emuladores no son compatibles con GL2, pero como ese puesto menciona, que trabajó para mí en un dispositivo real.

0

Puede ser porque está utilizando la instancia GL10 que estamos recibiendo como parámetro en onSurfaceCreated(), onSurfaceChanged() y onDrawFrame() en su aplicación Procesador. Como tiene la intención de usar OpwnGL ES 2.0, podemos y probablemente no usemos la instancia y usemos una alternativa en su lugar. ¡Hay alternativas! ¡Esta es la razón por la que vemos esos nombres de nombres y códigos no usados ​​o similares en toda la red!

Cuestiones relacionadas