Je reçois le message d'erreur "Appelé API OpenGL ES non implémentée" lors de l'essai de l'exemple GLES20 fourni par developer.Android.com. J'ai modifié l'échantillon, cependant. La raison était parce que J'ai eu une exception IllegalArgumentException dans GLSurfaceView.BaseConfigChooser.chooseconfig, alors j'ai remplacé mGLSurfaceView.setEGLContextClientVersion( 2 );
Le nouveau 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 );
}
L'erreur "API OpenGL ES appelée non implémentée" se produit par exemple à GLES20.glCreateShader;
ou GLES20.glShaderSource
.
J'ai pensé, peut-être pour vérifier la version, que j'ai appelé gl.glGetString( GLES20.GL_VERSION );
dans public void onSurfaceCreated( GL10 gl, EGLConfig config )
. GlGetString a renvoyé "OpenGL ES-CM 1.0". OnSurfaceCreated est appelé après le choix de la configuration et la création du contexte. Je ne comprends donc vraiment pas pourquoi glGetString renvoie "OpenGL ES-CM 1.0".
J'utilise l'API Android 2.2 et j'ai essayé l'exemple sur un périphérique virtuel Android 2.2 et sur un HTC Wildfire, avec Android 2.2.1.
J'apprécie toute aide
Vous devez activer OpenGL ES 2.0 dans votre application Android.
Tout d’abord, dans votre AndroidManifest.xml, assurez-vous de disposer des éléments suivants:
<uses-feature Android:glEsVersion="0x00020000"></uses-feature>
<uses-sdk Android:targetSdkVersion="8" Android:minSdkVersion="8"></uses-sdk>
Deuxièmement, créez une sous-classe de GLSurfaceView comme ceci:
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);
}
}
POUR NDK
Assurez-vous des listes d'attributs de choix et d'attributs de contexte:
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);
Voir cet article - triangle opengl dans Android
Comme mentionné ici, les émulateurs ne supportent pas GL2, mais comme le mentionne cet article, cela a fonctionné pour moi sur un appareil réel.
Ce n'est pas une erreur, mais une déclaration. Il vous indique simplement que votre cible ne prend pas en charge OpenGL ES version 2.0.
C'est peut-être parce que vous utilisez l'instance GL10 que nous obtenons en tant que paramètre dans onSurfaceCreated (), onSurfaceChanged () et onDrawFrame () dans votre implémentation de Renderer. Puisque vous avez l’intention d’utiliser OpenGL ES 2.0, nous ne pouvons probablement pas utiliser l’instance, mais plutôt une alternative. Il y a des alternatives! C'est la raison pour laquelle nous voyons ces noms de paramètres et de codes inutilisés ou similaires sur le net!