简体   繁体   中英

ERROR/libEGL(206): call to OpenGL ES API with no current context

I have a simple Square with openGL es 1 and Android 1.5. The square is painted on the center of the screen.

I want that when the user press on the screen, or moves the finger on the screen, the square get's moved to that position. For do this I tried with GLuUnProject, I tried to obtain the opengl coordinate that matches with the window XY coordinate touched with the finger (to translate the polygon to that coordinate in the future), and I'm writing the coordinates on the LogCat.

The coordinates I'm receiving are not true coordinates, are wrong coordinates, also I'm getting the error of the title of the question. ERROR/libEGL(206): call to OpenGL ES API with no current context

The LogCat:

11-07 09:43:40.012: DEBUG/XXXXXXXXX(203): X: -1.2918732
11-07 09:43:40.023: DEBUG/XXXXXXXXX(203): Y: 0.050911963
11-07 09:43:40.042: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.042: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.042: DEBUG/XXXXXXXXX(203): X: -1.2943747
11-07 09:43:40.052: DEBUG/XXXXXXXXX(203): Y: 0.04674524
11-07 09:43:40.152: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.152: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.172: DEBUG/XXXXXXXXX(203): X: 0.77298313
11-07 09:43:40.182: DEBUG/XXXXXXXXX(203): Y: -0.5083332
11-07 09:43:40.223: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.223: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.223: DEBUG/XXXXXXXXX(203): X: 0.77298313
11-07 09:43:40.223: DEBUG/XXXXXXXXX(203): Y: -0.5083332
11-07 09:43:40.402: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.402: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:40.402: DEBUG/XXXXXXXXX(203): X: -1.2943747
11-07 09:43:40.402: DEBUG/XXXXXXXXX(203): Y: 0.04674524
11-07 09:43:41.952: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:41.952: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:41.952: DEBUG/XXXXXXXXX(203): X: 0.77298313
11-07 09:43:41.952: DEBUG/XXXXXXXXX(203): Y: -0.5083332
11-07 09:43:42.042: ERROR/libEGL(203): call to OpenGL ES API with no current context
11-07 09:43:42.042: ERROR/libEGL(203): call to OpenGL ES API with no current context

My code:

public class MySurfaceView extends GLSurfaceView implements Renderer {  
private float INITIAL_Z = -35.0f;   
private Context context;
private Square square;
private float xrot;                 //X Rotation
private float yrot;                 //Y Rotation
private float zrot;                 //Z Rotation    
private float z = INITIAL_Z;            //Profundidad en el eje Z
private float x = 0.0f;             //eje X
private float y = 0.0f;             //eje Y

private MatrixGrabber mg = new MatrixGrabber(); //create the matrix grabber object in your initialization code    
private GL10 MyGl; //To make gl variable accesible on all the methods of the class
byte horizontal=-1; //0: LEFT  1:CENTER  2:RIGHT
byte vertical=-1; //0: TOP  1:CENTER  2:BOTTOM
float startX=-1;
float startY=-1;
float xMovement=0.0f;
float yMovement=0.0f;
private boolean movement_mode=false;

public MySurfaceView(Context context, Bitmap image, int width, byte horizontal, byte vertical) {
    super(context);
    this.context = context;
    setEGLConfigChooser(8, 8, 8, 8, 16, 0); //fondo transparente
    getHolder().setFormat(PixelFormat.TRANSLUCENT); //fondo transparente
    //Transformamos esta clase en renderizadora
    this.setRenderer(this);
    //Request focus, para que los botones reaccionen
    this.requestFocus();
    this.setFocusableInTouchMode(true);
    square = new Square(image);
    this.horizontal=horizontal;
    this.vertical=vertical;
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    MyGl=gl;
    gl.glDisable(GL10.GL_DITHER);               //dithering OFF
    gl.glEnable(GL10.GL_TEXTURE_2D);            //Texture Mapping ON
    gl.glShadeModel(GL10.GL_SMOOTH);            //Smooth Shading 
    gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
    gl.glEnable(GL10.GL_DEPTH_TEST);            //Depth Testing ON
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glClearColor(0,0,0,0); //fondo transparente
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);         
    //Cargamos la textura del cubo.
    square.loadGLTexture(gl, this.context);     
}

public void onDrawFrame(GL10 gl) {
    //Limpiamos pantalla y Depth Buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();
    //Dibujado
    gl.glTranslatef(x, y, z);           //Move z units into the screen
    //gl.glScalef(0.8f, 0.8f, 0.8f);            //Escalamos para que quepa en la pantalla
    //Rotamos sobre los ejes.
    gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);   //X
    gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);   //Y
    gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);   //Z
    //Dibujamos el cuadrado
    square.draw(gl);    
}

//si el surface cambia, resetea la vista, imagino que esto pasa cuando cambias de modo portrait/landscape o sacas el teclado físico en móviles tipo Droid.
public void onSurfaceChanged(GL10 gl, int width, int height) {
    if(height == 0) {                       
        height = 1;                         
    }
    gl.glViewport(0, 0, width, height);     //Reset Viewport
    gl.glMatrixMode(GL10.GL_PROJECTION);    //Select Projection Matrix
    gl.glLoadIdentity();                    //Reset Projection Matrix
    //Aspect Ratio de la ventana
    GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select Modelview Matrix
    gl.glLoadIdentity();                    //Reset Modelview Matrix
}

public boolean onTouchEvent(MotionEvent event) {
    float [] outputCoords=getOpenGLCoords(event.getX(), event.getY(), 0);
    x=(outputCoords[0]/outputCoords[3]);
    y=(outputCoords[1]/outputCoords[3]);
    //z=outputCoords[2]/outputCoords[3];
    Log.d("XXXXXXXXX", "X: "+x);
    Log.d("XXXXXXXXX", "Y: "+y);        
    return true; //El evento ha sido manejado
}

public float[] getOpenGLCoords(float xWin,float yWin,float zWin)
{
    int screenW=SectionManager.instance.getDisplayWidth();
    int screenH=SectionManager.instance.getDisplayHeight();
    //CODE FOR TRANSLATING FROM SCREEN COORDINATES TO OPENGL COORDINATES
    mg.getCurrentProjection(MyGl);
    mg.getCurrentModelView(MyGl);
    float [] modelMatrix = new float[16];
    float [] projMatrix = new float[16];
    modelMatrix=mg.mModelView;
    projMatrix=mg.mProjection;          
    int [] mView = new int[4];
    mView[0] = 0;
    mView[1] = 0;
    mView[2] = screenW; //width
    mView[3] = screenH; //height
    float [] outputCoords = new float[4];
    GLU.gluUnProject(xWin, ((float)screenH)-yWin, zWin, modelMatrix, 0, projMatrix, 0, mView, 0, outputCoords, 0);
    return outputCoords;
}
}

Note on possible duplicates

I believe this is not a duplicate of other questions with similar error, because in these questions, the solution of the error is that there are various threads and there is a problem with various threads, but I'm not using various threads.

Check these two lines:

mg.getCurrentProjection(MyGl);
mg.getCurrentModelView(MyGl);

They are called on main thread while supposed to be called on rendering one. You don't have to store the MyGl attribute cause it is valid only in OpenGL callbacks (like onDrawFrame(GL10 gl) where you already have the gl variable. You need to make projection and modelview matrices attributes of yhe class and update them every time you draw the frame (and use the when you need to calculate gluUnProject).

It may be because you are using the GL10 instance we are getting as a parameter in onSurfaceCreated(), onSurfaceChanged() and onDrawFrame() in your Renderer implementation. Since you intend to use OpenGL ES 2.0, we can and probably not use the instance and use an alternative instead. There are alternatives!This is the reasons we see those parameters names and unUsed or similar in codes across the net!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM