Domanda

Sto lavorando per implementare un OpenGL ES 2.0 completamente in C++ per Android.

Attualmente il nostro programma funziona senza JNI o ​​alcuna classe Java nel progetto, utilizzando invece solo NativeActivity.

Concentrandoci sulla parte di rendering dell'applicazione stessa, abbiamo un metodo semplice:

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

In Android.mk era incluso:

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

E in AndroidManifest.xml viene informato:

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

Quindi, il programma esegue il debug e la compilazione senza problemi.Quando impostato per l'esecuzione, arriva il messaggio:

    error  libEGL   called unimplemented OpenGL ES API

Il Forum fornisce un suggerimento realizzabile per Java - androide:GLES20:Chiamata API OpenGL ES non implementata , includendo nel codice il comando setEGLContextClientVersion:

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

Tuttavia, setEGLContextClientVersion è una specie di metodo wrapper pensato per Java.

setEGLContextClientVersion non appartiene al nativo OpenGL ES e non può essere applicabile per lo sviluppo OGLES C++ nativo.

Pertanto, ho usato invece:

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

Ma l’errore non è ancora scomparso.

È stato utile?

Soluzione

Stai utilizzando un dispositivo reale (quale?) o utilizzi un emulatore (che non supporta OGL ES2)?Inoltre non sono sicuro che collegare GLESv1_CM e GLESv2 nella stessa app sia una buona idea.Se desideri OpenGL ES 2.0, collegati solo a GLESv2.

Come hai inizializzato il contesto EGL?Hai utilizzato l'attributo EGL EGL_OPENGL_ES2_BIT come:

EGLint aEGLAttributes[] =
{
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // <--- OpenGL ES 2.0
    ...
    EGL_NONE
};
...
eglChooseConfig(m_EGLDisplay, aEGLAttributes, aEGLConfigs, 1,
            &cEGLConfigs)
...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top