ICode9

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

SurfaceView和GLSurfaceView

2021-06-19 17:33:09  阅读:212  来源: 互联网

标签:GLSurfaceView SurfaceView egl10 EGL gl public


因为所有的案例通过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);
    }
}

标签:GLSurfaceView,SurfaceView,egl10,EGL,gl,public
来源: https://www.cnblogs.com/kw28188151/p/14903598.html

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

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

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

ICode9版权所有