ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

EGL环境创建

2019-12-29 14:57:29  阅读:232  来源: 互联网

标签:EglHelper int 创建 环境 EGL10 EGL new public


EGL定义

是OpenGL EL和本地窗口系统的接口,不同平台上EGL配置是不一样的,而OpenGL的调用方式是一致的,OpenGL跨平台就是依赖于EGL接口

EGL环境创建目的

当我们需要把同一个场景渲染到不同的Surface上是,此时系统GLSurfaceView就不能满足需求了,需要自己创建EGL环境来实现渲染操作。

OpenGL整体是一个状态机,通过改变状态就可以改变后续的渲染方式,而EGLcontext(EGL上下文)保持所有的状态,因此可以通过共享EGLContext来实现同一个场景渲染到不同Surface上

GLSurfaceView有一个EglHelper

实例:创建自己的EglHelper

 可参考GLSurfaceView里面的EglHelper方法

第一步:创建EglHelper类

public class EglHelper {

    private EGL10 mEgl;
    private EGLDisplay mEglDisplay;
    private EGLContext mEglContext;
    private EGLSurface mEglSurface;

    public void initEgl(Surface surface, EGLContext eglContext)
    {

        //1、
        mEgl = (EGL10) EGLContext.getEGL();

        //2、
        mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
        if (mEglDisplay == EGL10.EGL_NO_DISPLAY) {
            throw new RuntimeException("eglGetDisplay failed");
        }

        //3、
        int[] version = new int[2];
        if(!mEgl.eglInitialize(mEglDisplay, version)) {
            throw new RuntimeException("eglInitialize failed");
        }

        //4、
        int [] attrbutes = new int[]{
                EGL10.EGL_RED_SIZE, 8,
                EGL10.EGL_GREEN_SIZE, 8,
                EGL10.EGL_BLUE_SIZE, 8,
                EGL10.EGL_ALPHA_SIZE, 8,
                EGL10.EGL_DEPTH_SIZE, 8,
                EGL10.EGL_STENCIL_SIZE, 8,
                EGL10.EGL_RENDERABLE_TYPE, 4,
                EGL10.EGL_NONE};

        int[] num_config = new int[1];
        if(!mEgl.eglChooseConfig(mEglDisplay, attrbutes, null, 1, num_config))
        {
            throw new IllegalArgumentException("eglChooseConfig failed");
        }

        int numConfigs = num_config[0];
        if (numConfigs <= 0) {
            throw new IllegalArgumentException(
                    "No configs match configSpec");
        }

        //5、
        EGLConfig[] configs = new EGLConfig[numConfigs];
        if (!mEgl.eglChooseConfig(mEglDisplay, attrbutes, configs, numConfigs,
                num_config)) {
            throw new IllegalArgumentException("eglChooseConfig#2 failed");
        }

        //6、
        if(eglContext != null)
        {
            mEglContext = mEgl.eglCreateContext(mEglDisplay, configs[0], eglContext, null);
        }
        else
        {
            mEglContext = mEgl.eglCreateContext(mEglDisplay, configs[0], EGL10.EGL_NO_CONTEXT, null);
        }

        //7、
        mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, configs[0], surface, null);

        //8、
        if(!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext))
        {
            throw new RuntimeException("eglMakeCurrent fail");
        }
    }

    public boolean swapBuffers()
    {
        if(mEgl != null)
        {
            return mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
        }
        else
        {
            throw new RuntimeException("egl is null");
        }
    }

    public EGLContext getmEglContext() {
        return mEglContext;
    }

    public void destoryEgl()
    {
        if(mEgl != null)
        {
            mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
                    EGL10.EGL_NO_SURFACE,
                    EGL10.EGL_NO_CONTEXT);

            mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
            mEglSurface = null;

            mEgl.eglDestroyContext(mEglDisplay, mEglContext);
            mEglContext = null;

            mEgl.eglTerminate(mEglDisplay);
            mEglDisplay = null;
            mEgl = null;
        }
    }

}

 

 

 

修改MainActivity代码

      surfaceView = findViewById(R.id.surfaceview);
        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {

            }

            @Override
            public void surfaceChanged(final SurfaceHolder holder, int format, final int width, final int height) {
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        //初始化EGL
                        EglHelper eglHelper = new EglHelper();
                        eglHelper.initEgl(holder.getSurface(),null);
                        while(true){
                            //设置窗口大小
                            GLES20.glViewport(0,0,width,height);
                            //清除颜色缓冲区
                            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
                            //使用指定颜色清屏
                            GLES20.glClearColor(1.0f,1.0f,0.0f,1.0f);
                            //自动刷新
                            eglHelper.swapBuffers();
                            try {
                                Thread.sleep(16);
                            }catch (InterruptedException e){
                                e.printStackTrace();
                            }
                        }
                    }
                }.start();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });

 

修改layout

<SurfaceView
       android:id="@+id/surfaceview"
       android:layout_width="match_parent"
       android:layout_height="match_parent"></SurfaceView>

  

 

 

 

 

 

   

标签:EglHelper,int,创建,环境,EGL10,EGL,new,public
来源: https://www.cnblogs.com/cxj1821/p/12037560.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有