Android: GLES20: Se llama API OpenGL ES no implementada
Estoy recibiendo un error "Called unimplemented OpenGL ES API", al intentar el ejemplo GLES20, proporcionado por developer.android.com. He modificado la muestra, sin embargo. La razón era porque conseguí una IllegalArgumentException en GLSurfaceView.BaseConfigChooser.chooseconfig, así que substituí mGLSurfaceView.setEGLContextClientVersion( 2 );
El nuevo OnCreateMethod:
- ¿Qué significan los argumentos para frustum en OpenGL?
- SurfaceTexture.OnFrameAvailableListener deja de ser llamado
- Cambio de OpenGL ES 1.0 a 2.0
- XML FrameLayout ha bajado mi framerate OpenGL SurfaceView (fps)
- Herramientas de OpenGL ES para Android
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 ); }
El error "API de OpenGL ES no GLES20.glCreateShader;
" se produce por ejemplo en GLES20.glCreateShader;
O GLES20.glShaderSource
.
Pensé, quizás para comprobar la versión, así que llamé gl.glGetString( GLES20.GL_VERSION );
En public void onSurfaceCreated( GL10 gl, EGLConfig config )
. GlGetString devolvió "OpenGL ES-CM 1.0". OnSurfaceCreated se llama 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 probé el ejemplo en un dispositivo Android 2.2 Virtual y en un HTC Wildfire, con Android 2.2.1.
Agradezco cualquier ayuda
- Android Aplicar efecto en el marco de la cámara
- android ffmpeg opengl es hacer película
- ¿Hacer una animación a pantalla completa en Android? ¿Debo usar OPENGL?
- Visualización de texto (como puntuación) que cambia en cada fotograma
- Nunca obtuvo 480 * 800 total cuando se utiliza la proyección ortogonal 2D en opengl-es
- Android: Limpiar correctamente después de OpenGL
- Convertir matriz de int en Bitmap en Android
- Android Opengl ES: GLUtils.glTexImage2D causando GL_INVALID_ENUM
Debe habilitar OpenGL ES 2.0 en su aplicación para Android.
En primer lugar, en tu AndroidManifest.xml, asegúrate de que tienes 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 como este:
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úrese de que elige atributos y listas de atributos de contexto:
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);
Ver este post – triangle opengl en android
Como se mencionó allí, los emuladores no soportan GL2, pero como menciona ese post, funcionó para mí en un dispositivo real.
Esto no es un error, sino una declaración. Simplemente le indica que su objetivo no es compatible con OpenGL ES versión 2.0.
Puede ser porque está utilizando la instancia GL10 que estamos recibiendo como parámetro en onSurfaceCreated (), onSurfaceChanged () y onDrawFrame () en la implementación de Renderer. Puesto que usted intenta usar OpwnGL ES 2.0, podemos y probablemente no usar la instancia y usar una alternativa en su lugar. ¡Hay alternativas! ¡Éstas son las razones por las que vemos esos nombres de los parámetros y unUsed o similar en códigos a través de la red!
- El efecto de ondulación de fondo en los elementos de la barra de herramientas de StandAlone se ha ido
- Android RadioButton no puede desarmar usando el método setChecked (falso)