2012-02-27 119 views
5

我正在努力在C++ for Android中完全實現OpenGL ES 2.0。Android原生NDK OpenGL ES:未實現API

當前我們的程序在項目中運行時沒有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 native,不適用於本地C++ OGLES開發。

因此,我代替:

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

但錯誤並沒有消失呢。

回答

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) 
... 
+0

謝謝你!我遵循你的建議。它解決了這個問題。 – ThreaderSlash 2012-02-28 07:36:43