5

Android 用の C++ で OpenGL ES 2.0 を完全に実装する作業を行っています。

現在、私たちのプログラムは、JNI やプロジェクト内の Java クラスなしで実行され、代わりに NativeActivity のみを使用しています。

アプリケーションのレンダリング部分自体に焦点を当てると、簡単な方法が得られました。

renderWorld()
{   GLfloat vVertices[] = {  0.0f,  0.5f, 0.0f,
                            -0.5f, -0.5f, 0.0f,
                             0.5f, -0.5f, 0.0f };
    glClear ( GL_COLOR_BUFFER_BIT );

    glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
    glEnableVertexAttribArray ( 0 );

    glDrawArrays (GL_TRIANGLES, 0, 3 );
}

Android.mk には以下が含まれていました。

LOCAL_LDLIBS    := -landroid -llog -lEGL -lGLESv1_CM -lOpenSLES -lGLESv2

そして AndroidManifest.xml で通知されます:

    <uses-feature android:glEsVersion="0x00020000"></uses-feature>

したがって、プログラムは問題なくデバッグおよびコンパイルされます。実行するように設定すると、次のメッセージが表示されます。

    error  libEGL   called unimplemented OpenGL ES API

フォーラムは、java - Android: GLES20: Called unimplemented OpenGL ES APIで実行可能な提案を提供し、コマンド setEGLContextClientVersion: をコードに含めます。

    GLSurfaceView surfaceView = new GLSurfaceView(this);
    surfaceView.setEGLContextClientVersion(2);

ただし、setEGLContextClientVersion は、Java 用の一種のラッパー メソッドです。

setEGLContextClientVersion は OpenGL ES ネイティブに属しておらず、ネイティブ C++ OGLES 開発には適用できません。

したがって、代わりに使用しました:

const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION, 2,EGL_NONE};
mContext = eglCreateContext(mDisplay, lConfig, EGL_NO_CONTEXT,attribList);

しかし、エラーはまだ消えていません。

4

1 に答える 1

6

実際のデバイスを使用していますか(どちらですか?)、またはエミュレーターを使用していますか(OGL ES2をサポートしていません)?また、同じアプリでGLESv1_CMとGLESv2をリンクするのが良いかどうかもわかりません。OpenGL ES 2.0が必要な場合は、GLESv2にのみリンクしてください。

EGLコンテキストをどのように初期化しましたか?次のようなEGL属性EGL_OPENGL_ES2_BITを使用しましたか?

EGLint aEGLAttributes[] =
{
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // <--- OpenGL ES 2.0
    ...
    EGL_NONE
};
...
eglChooseConfig(m_EGLDisplay, aEGLAttributes, aEGLConfigs, 1,
            &cEGLConfigs)
...
于 2012-02-27T18:26:23.690 に答える