web-dev-qa-db-ja.com

Android:GLES20:実装されていないOpenGL ES APIが呼び出されました

Developer.Android.comから提供されているGLES20サンプルを実行しようとすると、「Called unimplemented 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 );
}
_

「Called unimplemented 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」を返しました。 OnSurfaceCreatedは、設定を選択してコンテキストを作成した後に呼び出されるため、glGetStringが「OpenGL ES-CM 1.0」を返す理由が本当にわかりません。

私はAndroid 2.2 APIを使用しており、Android 2.2仮想デバイスとHTC WildfireでAndroid = 2.2.1。

助けてくれてありがとう

20
Coolkill

AndroidアプリでOpenGL ES 2.0を有効にする必要があります。

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

この投稿を参照してください- Androidの三角形opengl

そこに述べられているように、エミュレーターはGL2をサポートしていませんが、その投稿が言及しているように、実際のデバイスでは私にとってはうまくいきました。

2
iDurocher

これはエラーではなく、ステートメントです。ターゲットがOpenGL ESバージョン2.0をサポートしていないことを通知するだけです。

1
ognian

レンダラー実装のonSurfaceCreated()、onSurfaceChanged()、onDrawFrame()のパラメーターとして取得しているGL10インスタンスを使用していることが原因である可能性があります。 OpenGL ES 2.0を使用する予定なので、インスタンスを使用することはできず、代わりに代替を使用します。代替案があります!これが、これらのパラメーター名と未使用または類似のコードがネット全体で見られる理由です。

0
stack_ved