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

时间:2011-11-07 10:54:47

标签: android opengl-es

首先,这不是具有类似错误的其他问题的重复,因为在这些问题中,错误的解决方案是存在各种线程并且各种线程存在问题,但我不使用各种线程,我的问题不一样。

我有一个简单的Square with openGL es 1和Android 1.5。广场被画在屏幕的中央。

我希望当用户按下屏幕或在屏幕上移动手指时,方形移动到该位置。为了做到这一点,我尝试使用GLuUnProject,我试图获得与用手指触摸的窗口XY坐标匹配的opengl坐标(将多边形转换为将来的多边形),并且我正在写入LogCat上的坐标。

我接收的坐标不是真正的坐标,坐标是错误的,我也得到了问题的错误。 ERROR/libEGL(206): call to OpenGL ES API with no current context

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

我的代码:

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

2 个答案:

答案 0 :(得分:2)

检查以下两行:

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

它们在主线程上调用,而应该在渲染时调用它们。您不必存储MyGl属性,因为它仅在OpenGL回调中有效(例如您已经拥有gl变量的onDrawFrame(GL10 gl)。您需要制作类的投影和模型视图矩阵属性并每次更新它们你绘制框架(并使用你需要计算gluUnProject的时间)。

答案 1 :(得分:0)

可能是因为您正在使用我们在Renderer实现中的onSurfaceCreated(),onSurfaceChanged()和onDrawFrame()中获取的GL10实例。由于您打算使用OpenGL ES 2.0,我们可以也可能不使用该实例并使用替代方案。还有其他选择!这就是我们在网络上的代码中看到这些参数名称和未使用或相似的原因!

相关问题