简体   繁体   English

错误/libEGL(206):在没有当前上下文的情况下调用 OpenGL ES API

[英]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.我有一个带有 openGL es 1 和 Android 1.5 的简单 Square。 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.为此,我尝试使用 GLuUnProject,尝试获取与手指触摸的窗口 XY 坐标匹配的 opengl 坐标(将来将多边形转换为该坐标),然后我将坐标写入 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).您不必存储 MyGl 属性,因为它仅在 OpenGL 回调中有效(例如onDrawFrame(GL10 gl) ,其中您已经拥有 gl 变量。您需要制作 yhe 类的投影和模型视图矩阵属性并每次更新它们您绘制框架(并在需要计算 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.这可能是因为您正在使用我们在 Renderer 实现中的 onSurfaceCreated()、onSurfaceChanged() 和 onDrawFrame() 中作为参数获取的 GL10 实例。 Since you intend to use OpenGL ES 2.0, we can and probably not use the instance and use an alternative instead.由于您打算使用 OpenGL ES 2.0,我们可以也可能不使用该实例,而是使用替代方案。 There are alternatives!This is the reasons we see those parameters names and unUsed or similar in codes across the net!还有其他选择!这就是我们在网络代码中看到那些参数名称和 unUsed 或类似的原因!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 E / libEGL:调用OpenGL ES API,没有当前上下文(每个线程记录一次) - Android / SDL - E/libEGL: call to OpenGL ES API with no current context (logged once per thread) - Android/SDL 在没有当前上下文的情况下调用OpenGL ES API - Call to OpenGL ES API with no current context ARToolkit-在没有当前上下文的情况下调用OpenGL ES API - ARToolkit - call to OpenGL ES API with no current context Android NDK OpenGL glDeleteTextures导致错误:在没有当前上下文的情况下调用OpenGL ES API - Android NDK OpenGL glDeleteTextures causes error: call to OpenGL ES API with no current context 没有当前上下文的opengl es api - opengl es api with no current context libEGL称为未实现的OpenGL ES Api Android - libEGL called unimplemented OpenGL ES Api Android E / libEGL:称为未实现的OpenGL ES API - E/libEGL﹕ called unimplemented OpenGL ES API 为什么我“在没有当前上下文的情况下调用OpenGL ES API”? - Why am I getting “call to OpenGL ES API with no current context”? 在Android中使用imageloader时“在没有当前上下文的情况下调用OpenGL ES API” - “call to OpenGL ES API with no current context” while using imageloader in android 调用没有当前上下文的OpenGL ES API(每个线程记录一次) - call to OpenGL ES API with no current context (logged once per thread)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM