Подтвердить что ты не робот

Android: GLES20: вызывается нереализованным API OpenGL ES

При попытке образца GLES20, предоставленного разработчиком .android.com, я получаю ошибку "Вызванный unimplemented OpenGL ES API". Я модифицировал образец. Причина была в том, что Я получил исключение IllegalArgumentException в GLSurfaceView.BaseConfigChooser.chooseconfig, поэтому я заменил 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 );
}

Ошибка "Вызываемый нереализованный API OpenGL ES" возникает, например, при GLES20.glCreateShader; или GLES20.glShaderSource.

Я подумал, может быть, проверить версию, поэтому я позвонил gl.glGetString( GLES20.GL_VERSION ); в public void onSurfaceCreated( GL10 gl, EGLConfig config ). glGetString возвращает "OpenGL ES-CM 1.0". OnSurfaceCreated вызывается после выбора конфигурации и создания контекста, поэтому я действительно не понимаю, почему glGetString возвращает "OpenGL ES-CM 1.0".

Я использую API Android 2.2 и пробовал образец на виртуальном устройстве Android 2.2 и на HTC Wildfire с Android 2.2.1.

Я ценю любую помощь

4b9b3361

Ответ 1

Вам нужно включить OpenGL ES 2.0 в ваше приложение для Android.

Во-первых, в вашем AndroidManifest.xml убедитесь, что у вас есть следующее:

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

Во-вторых, создайте подкласс 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

Убедитесь, что вы выбираете атрибуты атрибутов и атрибутов контекста:

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

Ответ 2

Смотрите это сообщение - треугольник opengl в андроиде

Как уже упоминалось, эмуляторы не поддерживают GL2, но, как говорится в этом сообщении, он работал на меня на самом устройстве.

Ответ 3

Это не ошибка, а инструкция. Он просто говорит вам, что ваша цель не поддерживает OpenGL ES версии 2.0.

Ответ 4

Возможно, потому, что вы используете экземпляр GL10, который мы получаем как параметр в onSurfaceCreated(), onSurfaceChanged() и onDrawFrame() в вашей реализации Renderer. Поскольку вы собираетесь использовать OpwnGL ES 2.0, мы можем и, возможно, не использовать экземпляр и вместо этого использовать альтернативу. Есть альтернативы! Вот почему мы видим эти имена параметров и unUsed или аналогичные в кодах по сети!