[Java] [SurfaceView] 使用EGL

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 渲染。

Khronos EGL

提示

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值