zoukankan      html  css  js  c++  java
  • SurfaceView和GLSurfaceView

    因为所有的案例通过java实现,所以需要了解一下surfaceView和GLSurfaceView,他们作为绘制的载体,我们绘制的东西需要绘制到它们上面,

    GLSurfaceView和SurfaceView的区别

    • GLSurfaceView管理了EGL的相关创建部分,不需要自己常见,并且使用的时候只需要调用三个声明周期函数。SurfaceView使用的时候需要自己创建EGL相关的内容
    • GLSurfaceView不需要自己创建线程,SurfaceView需要自己创建绘制线程。

    GLSurfaceView是SurfaceView的一个封装,它的功能比SurfaceView强大。

    使用SurfaceView实现出简易的GLSurfaceView

    • 我们使用SurfaceView来实现一个简易的GLSurfaceView,所以继承SurfaceView。
    public class EGLGLSurfaceView extends SurfaceView implements SurfaceHolder.Callback 
    
    • 实现接口,需要一下几个方法
     @Override
        public void surfaceCreated(SurfaceHolder holder) {
            
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
    
        }
    

    我们在创建方法执行的时候创建绘制线程。

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            startGLThreads();
        }
    

    基本就那么多,下来主要是线程中需要做什么?

    • 创建一个EGL(会有一章专门来讲解)
     EGL10 egl10 = (EGL10) EGLContext.getEGL();
     //获取表面   得到默认的表面
     EGLDisplay eglDisplay = egl10.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
    //初始化 
    egl10.eglInitialize(eglDisplay, new int[2]);
    EGLConfig[] configs = new EGLConfig[1];
    //匹配的EGLConfigs
    egl10.eglChooseConfig(eglDisplay,
                        new int[]{EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE},
                        configs,
                        1,
                        new int[1]);
    EGLConfig eglEGLConfig = configs[0];
    //创建渲染窗口
    EGLSurface eglSurface = egl10.eglCreateWindowSurface(eglDisplay, eglEGLConfig, EGLGLSurfaceView.this.getHolder(), null);
    //创建渲染上下文
    EGLContext eglContext = egl10.eglCreateContext(eglDisplay, eglEGLConfig, EGL10.EGL_NO_CONTEXT, null);
    //使得一个上下文成为当前   绘制前需要到一个操作
    egl10.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
    mGL10 = (GL10) eglContext.getGL();
    // 刷帧
    while (isKeyFlag()) {
          gl.glClearColor(1, 0,0, 1.0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    //交换 缓存区
           egl10.eglSwapBuffers(eglDisplay, eglSurface);
    }
    

    在surfaceDestroyed调用

           egl10.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE,
                        EGL10.EGL_NO_CONTEXT);
                egl10.eglDestroyContext(eglDisplay, eglContext);
                egl10.eglDestroySurface(eglDisplay, eglSurface);
                mGL10 = null;
    
    • 创建open gl es相关的,在是一个循环来绘制图形。
    gl.glClearColor(1, 0,0, 1.0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    

    将整个屏幕变为红色。
    上面就是基本SurfaceView封装成为GLSurfaceView最核心的操作。

    GLSurfaceView绘制

    只需要书写opengl代码就可以了,其它操作已经被封装掉了。
    做出与上面相同的操作只需要执行先的一些代码

    
    public class xxx extends GLSurfaceView implements GLSurfaceView.Renderer {
        public xxx(Context context) {
            super(context);
        }
    
        public xxx(Context context, AttributeSet attrs) {
            super(context, attrs);
            setRenderer(this);
        }
    
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            
        }
    
        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
    
        }
    
        @Override
        public void onDrawFrame(GL10 gl) {
            gl.glClearColor(1, 0,0, 1.0f);
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        }
    }
    
  • 相关阅读:
    yum源的制作
    债券到期收益率计算公式
    IMP同库Type对象导入报错ORA-02304
    oracle自动挂掉问题分析
    CPP读取dbf文件
    oracle忘记system密码
    沪C转浙A
    业务词汇
    VS2017使用Resharp开发CPP程序
    CPP调用webservice
  • 原文地址:https://www.cnblogs.com/kw28188151/p/14903598.html
Copyright © 2011-2022 走看看