Android:GLES20:调用未实现的OpenGL ES API

在尝试由developer.android.com提供的GLES20示例时,出现“调用未实现的OpenGL ES API”错误。 不过,我修改了这个示例。 原因是因为我在GLSurfaceView.BaseConfigChooser.chooseconfig中得到了IllegalArgumentException,所以我换成了mGLSurfaceView.setEGLContextClientVersion( 2 );

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

“调用未实现的OpenGL ES API”错误发生在例如GLES20.glCreateShader; 或者GLES20.glShaderSource

我想,也许要检查版本,所以我叫gl.glGetString( GLES20.GL_VERSION );public void onSurfaceCreated( GL10 gl, EGLConfig config ) 。 glGetString返回“OpenGL ES-CM 1.0”。 selectconfiguration并创build上下文之后调用OnSurfaceCreated,所以我真的不明白,为什么glGetString返回“OpenGL ES-CM 1.0”。

我正在使用Android 2.2 API,并在Android 2.2虚拟设备和HTC Wildfire上使用Android 2.2.1尝试了这个示例。

我感谢任何帮助

Solutions Collecting From Web of "Android:GLES20:调用未实现的OpenGL ES API"

您需要在Android应用程序中启用OpenGL ES 2.0。

首先,在你的AndroidManifest.xml中,确保你有以下几点:

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

其次,像这样创build一个GLSurfaceView的子类:

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

对于NDK

确保您的select属性和上下文属性列表:

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

看到这个post – android中的三angular形opengl

如上所述,仿真器不支持GL2,但正如后面提到的,它在我的实际设备上工作。

这不是一个错误,而是一个声明。 它只是告诉你,你的目标不支持OpenGL ES版本2.0。

这可能是因为您正在使用GL10实例作为参数在Renderer实现中的onSurfaceCreated(),onSurfaceChanged()和onDrawFrame()中获取。 既然你打算使用OpwnGL ES 2.0,我们可以也可能不使用这个实例,而是使用一个替代scheme。 有替代品!这就是我们在网上看到这些参数名称和未使用或类似代码的原因!