显示3D场景的类-GLSurfaceView

开发Opengl首先应该有个显示3D场景的类-GLSurfaceView(对于交互性较强的demo来说,一般采取自定义类继承GLSurfaceView的方式

小知识

     android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。

               SurfaceView是从View基类中派生出来的显示类。GLSurfaceView是基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是                                SurfaceView的子类,openGL专用。

  • 同时GLSurfaceView使得OpenGL ES 可以工作在 Activity 生命周期中

只需将GLSurfaceView的onResume和onPause方法与Activity的onResume和onPause方法进行绑定即可

  • GLSurfaceView还可设置渲染模式,调用GLSurfaceView.setRenderMode()方法来执行,参数如下

1.GLSurfaceView.RENDERMODE_CONTINUOUSLY :
    自动循环模式,GL线程以一 定的时间间隔自动的循环调用用户实现的onDrawFrame()方法进行一帧一帧的绘制
2.GLSurfaceView.RENDERMODE_WHEN_DIRTY :
   “脏”模式,当用户需要重绘的时候,主动 “拉”这个重绘过程,当需要重绘时,调用GLSurfaceView.requestRender()
          一般情况下使用脏模式,这样可以有效降低cpu负载。


有了显示3D场景的类,还需为GLSurfaceView设置一个渲染器,即创建并管理一个渲染线程

  • GLSurfaceView的渲染器设置是由接口GLSurfaceView.Renderer类实现的

GLSurfaceView.Renderer类中有三个用户自定义实现抽象方法,分别是

  1. onSurfaceCreated():该方法在渲染开始前调用,OpenGL ES 的绘制上下文被重建时也会被调用。当 activity 暂停绘制时,上下文会丢失,当 activity 继续绘制时,上下文会被重建。另外,创建长期存在的 OpenGL 资源(如 texture)往往也在这里进行。
  2. onSurfaceChanged():当 surface 的尺寸发生改变时该方法被调用(例:当横竖屏切换时, surface 的尺寸发生改变)。往往在这里设置 viewport(视口)。若你的 camera 是固定的,也可以在这里设置 camera(摄像机)。
  3. onDrawFrame():每帧都通过该方法进行绘制。绘制时通常先调用 glClear函数来清空 framebuffer(清空缓冲),然后在调用 OpenGL ES 的其它接口进行绘制。
在每一帧进行绘制时(即在方法onDrawFrame中)有关于绘制时通常先调用 glClear函数来清空 framebuffer(清空缓冲)的原因,博主找到的最合理的解释应该是OpenGL ES中的物体绘制并不是直接在屏幕上进行的,而是预先在帧缓冲区进行绘制,因此若不请出缓冲将可能产生不正确的绘制效果。

          帧缓冲主要包括以下三种

颜色缓冲区:

  颜色缓冲区(COLOR_BUFFER):用于存储每个片元的颜色值RGBA(红、绿、蓝、透明度)你需要渲染的场景最终每一个像素都要写入该缓冲区,然后由它在渲染到屏幕上显示.

深度缓冲区:

  深度缓冲区(DEPTH_BUFFER)与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试(即比较深度值大小,结果小于才可进入缓冲,否则丢弃),从而确定像素的遮挡关系,保证渲染正确.

模板缓冲区:

  模版缓冲(STENCIL_BUFFER)与深度缓冲大小相同,通过设置模版缓冲每个像素的值,我们可以指定在渲染的时候只渲染某些像素,从而可以达到一些特殊的效果.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

简而言之,GLSurfaceView就相当于一个显示屏,而若想在显示屏上显示图形则需要设置一个渲染器Renderer对图形进行绘制

-------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 关于调试:GLSurfaceView.setDebugFlags() 方法可以激活 log 或者错误检测,它们可以帮助调试 OpenGL ES 调用。具体使用时,在 GLSurfaceView 的构造函数中,调用 setRender() 之前调用GLSurfaceView.setDebugFlags()就可以了。


你可能感兴趣的:(显示3D场景的类-GLSurfaceView)