Android 错误/libEGL(206):在没有当前上下文的情况下调用OpenGL ES API
我有一个简单的正方形,带有openGL es 1和Android 1.5。正方形画在屏幕中央 我希望当用户按下屏幕,或在屏幕上移动手指时,正方形会移动到那个位置。为此,我尝试使用GLuUnProject,尝试获取opengl坐标,该坐标与手指接触的窗口XY坐标相匹配(以便将来将多边形转换为该坐标),并将坐标写入LogCat 我得到的坐标不是真坐标,是错误的坐标,我得到的是问题标题的错误<代码>错误/libEGL(206):在没有当前上下文的情况下调用OpenGL ES API 日志:Android 错误/libEGL(206):在没有当前上下文的情况下调用OpenGL ES API,android,opengl-es,Android,Opengl Es,我有一个简单的正方形,带有openGL es 1和Android 1.5。正方形画在屏幕中央 我希望当用户按下屏幕,或在屏幕上移动手指时,正方形会移动到那个位置。为此,我尝试使用GLuUnProject,尝试获取opengl坐标,该坐标与手指接触的窗口XY坐标相匹配(以便将来将多边形转换为该坐标),并将坐标写入LogCat 我得到的坐标不是真坐标,是错误的坐标,我得到的是问题标题的错误错误/libEGL(206):在没有当前上下文的情况下调用OpenGL ES API 日志: 11-07 09:
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;
}
}
关于可能重复的说明
我相信这不是与其他问题类似错误的重复,因为在这些问题中,错误的解决方案是存在不同的线程,不同的线程存在问题,但我没有使用不同的线程。检查这两行:
mg.getCurrentProjection(MyGl);
mg.getCurrentModelView(MyGl);
它们在主线程上被调用,而应该在呈现线程时被调用。您不必存储MyGl属性,因为它仅在OpenGL回调中有效(例如,
onDrawFrame(GL10 gl)
,您已经有了gl变量。您需要创建yhe类的投影和modelview矩阵属性,并在每次绘制帧时更新它们(需要计算gluUnProject时使用).这可能是因为您使用的是我们在onSurfaceCreated()、onSurfaceChanged()和onDrawFrame()中作为参数获得的GL10实例在您的渲染器实现中。由于您打算使用OpenGL ES 2.0,我们可以也可能不使用该实例,而是使用替代方案。存在替代方案!这就是为什么我们在整个网络的代码中看到这些参数名称和未使用的或类似的名称!true,错误已经消失,但现在我遇到了另一个问题,即值为X和Y给定的e不是实值,是误差值,例如,在屏幕的随机区域上按:X:0.0064407806 Y:-0.0072252387,并且总是这样的值……我认为问题是我将0作为gluUnProject的winZ值传递,但我不知道我必须作为winZ值传递什么:s这是因为您必须更新投影和模型视图矩阵。我在onDrawFrame方法上用以下两行更新它们:mg.getCurrentProjection(gl);mg.getCurrentModelView(gl);我真的认为问题在于winZ值,但我不知道如何获得该值:您需要使用光线投射来确定与3D对象的交点,而不是gluUnProject。但是如果您尝试一些没有交点的简单交互,则只需将屏幕坐标转换为标准化设备坐标。例如,如果屏幕宽度为320像素,您需要将100处的点转换为NDC,然后应用公式x=(2*100)/320-1==-0.375