web-dev-qa-db-fra.com

Android: GLES20: Appelée API OpenGL ES non implémentée

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

20
Coolkill

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

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.

2
iDurocher

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. 

1
ognian

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!

0
stack_ved