EGL
EGL™ 是 Khronos 渲染 API(如 OpenGL ES 或 OpenVG)与底层原生平台窗口系统之间的接口。它处理图形上下文管理、表面/缓冲区绑定和渲染同步,并使用其他 Khronos API 实现高性能、加速、混合模式的 2D 和 3D 渲染。EGL 还提供 Khronos 之间的互操作功能,以实现 API 之间的数据高效传输——例如在运行 OpenMAX AL 的视频子系统和运行 OpenGL ES 的 GPU 之间。
EGL 提供了创建渲染表面的机制,客户端 API(如 OpenGL ES 和 OpenVG)可以在其上进行绘制,为客户端 API 创建图形上下文,并通过客户端 API 和本地平台渲染 API 同步绘图。这支持使用 OpenGL ES 和 OpenVG 进行无缝渲染,以实现高性能、加速、混合模式的 2D 和 3D 渲染。
提示
javax.microedition.khronos.egl包里面貌似只提供到了EGL11,可能不支持OpenGL ES2和OpenGL ES3,建议使用android.opengl包里的
创建上下文
egl = (EGL10)EGLContext.getEGL();
display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
egl.eglInitialize(display, version);
int[] attribs = new int[]{
egl.EGL_SURFACE_TYPE,egl.EGL_WINDOW_BIT,
egl.EGL_RED_SIZE,8,
egl.EGL_GREEN_SIZE,8,
egl.EGL_BLUE_SIZE,8,
egl.EGL_ALPHA_SIZE,8,
egl.EGL_DEPTH_SIZE,8,
egl.EGL_NONE
};
int[] configNum = new int[1];
EGLConfig[] configs = new EGLConfig[1];
egl.eglChooseConfig(display, attribs, configs, 1, configNum);
config = configs[0];
surface = egl.eglCreateWindowSurface(display, config, m_holder, null);
context = egl.eglCreateContext(display, config, egl.EGL_NO_CONTEXT, null);
egl.eglMakeCurrent(display, surface, surface, context);
代码
package com.Diamond.gl10try;
import android.view.*;
import android.content.Context;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import android.util.Log;
import javax.microedition.khronos.egl.EGLConfig;
import android.opengl.GLES10;
import java.nio.FloatBuffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class MySurfaceView extends SurfaceView {
public class MyCallback implements SurfaceHolder.Callback {
public EGL10 egl;
public EGLDisplay display;
public EGLSurface surface;
public EGLContext context;
public EGLConfig config;
public GLES10 gl;
@Override
public void surfaceCreated(SurfaceHolder p1) {
egl = (EGL10)EGLContext.getEGL();
Log.i("egl", egl.toString());
display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY);
Log.d("display", display.toString());
int[] version = new int[2];
Log.i("eglInitialize", "" + egl.eglInitialize(display, version));
Log.i("egl version", version[0] + "." + version[1]);
int[] attribs = new int[]{
egl.EGL_SURFACE_TYPE,egl.EGL_WINDOW_BIT,
egl.EGL_RED_SIZE,8,
egl.EGL_GREEN_SIZE,8,
egl.EGL_BLUE_SIZE,8,
egl.EGL_ALPHA_SIZE,8,
egl.EGL_DEPTH_SIZE,8,
egl.EGL_NONE
};
int[] configNum = new int[1];
EGLConfig[] configs = new EGLConfig[1];
egl.eglChooseConfig(display, attribs, configs, 1, configNum);
Log.d("configNum[0]", "" + configNum[0]);
Log.d("configs[0]", configs[0].toString());
config = configs[0];
surface = egl.eglCreateWindowSurface(display, config, m_holder, null);
Log.d("surface", surface.toString());
context = egl.eglCreateContext(display, config, egl.EGL_NO_CONTEXT, null);
Log.d("context", context.toString());
Log.d("eglMakeCurrent", "" + egl.eglMakeCurrent(display, surface, surface, context));
float[] ver = new float[]{
0.0f,0.5f,
-0.5f,-0.5f,
0.5f,-0.5f
};
ByteBuffer bb = ByteBuffer.allocateDirect(ver.length * 4);
bb.order(ByteOrder.nativeOrder());
FloatBuffer fb = bb.asFloatBuffer();
fb.put(ver);
fb.position(0);
gl.glViewport(0, 0, getWidth(), getHeight());
gl.glClear(gl.GL_COLOR_BUFFER_BIT);
gl.glVertexPointer(2, gl.GL_FLOAT, 2 * 4, fb);
gl.glEnableClientState(gl.GL_VERTEX_ARRAY);
gl.glColor4f(0, 0, 1, 1);
gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3);
egl.eglSwapBuffers(display, surface);
}
@Override
public void surfaceChanged(SurfaceHolder p1, int p2, int p3, int p4) {
}
@Override
public void surfaceDestroyed(SurfaceHolder p1) {
Log.i("surface destroyed", "");
egl.eglMakeCurrent(display, egl.EGL_NO_SURFACE, egl.EGL_NO_SURFACE, egl.EGL_NO_CONTEXT);
egl.eglDestroyContext(display, context);
egl.eglDestroySurface(display, surface);
egl.eglTerminate(display);
}
}
public MyCallback m_callback;
public SurfaceHolder m_holder;
public MySurfaceView(Context context) {
super(context);
m_callback = new MyCallback();
m_holder = getHolder();
m_holder.addCallback(m_callback);
}
}