2011-11-07 63 views
0

首先,这不是其他类似错误的问题的重复,因为在这些问题中,错误的解决方案是存在各种线程和各种线程有问题,但我没有使用各种线程,我的问题是不一样的。错误/ libEGL(206):在没有当前上下文的情况下调用OpenGL ES API

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

我希望当用户在屏幕上按下或在屏幕上移动手指时,方块移动到该位置。为了做到这一点,我尝试使用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

检查这两行:

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

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

+0

true,错误消失了,但现在我开始了g另一个问题,给出的X和Y值不是实数值,是错误的值,例如,按下屏幕的随机区域:X:0.0064407806 Y:-0.0072252387,并且总是这样的值....我认为问题是我传递0作为gluUnProject的winZ值,但我不知道我必须通过winZ值:S – NullPointerException

+0

这是因为你必须更新你的投影和模型视图矩阵。 – Max

+0

我正在使用这两行onDrawFrame方法更新它们:mg.getCurrentProjection(gl); \t \t mg.getCurrentModelView(gl); – NullPointerException

0

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

相关问题