您的位置:首页 > 其它

显示3D场景的类-GLSurfaceView

2017-02-13 03:27 190 查看

开发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类中有三个用户自定义实现抽象方法,分别是

onSurfaceCreated():该方法在渲染开始前调用,OpenGL
ES 的绘制上下文被重建时也会被调用。当 activity 暂停绘制时,上下文会丢失,当 activity 继续绘制时,上下文会被重建。另外,创建长期存在的 OpenGL 资源(如 texture)往往也在这里进行。

onSurfaceChanged():当
surface 的尺寸发生改变时该方法被调用(例:当横竖屏切换时, surface 的尺寸发生改变)。往往在这里设置 viewport(视口)。若你的 camera 是固定的,也可以在这里设置 camera(摄像机)。

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()就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: