显示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()就可以了。
相关文章推荐
- 在3D场景中显示汉字
- 在silverlight上显示3D场景
- [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
- Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版
- UE4创建3D场景中的UI方法及在UI上面显示三维物体
- [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
- [Unity 3D教程]教你如何在3D场景中选择物体并显示轮廓效果
- [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版
- 在3D场景中显示汉字
- ugui物体随着摄像机跟随3d场景物体显示
- 如何保持一个3D场景总是前端显示 —— Open Inventor In Action
- Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版
- Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
- xna 4.0 在3D 场景中用spritebatch 写2D文字3D显示不正常的问题
- Unity 3D:在现有的Android游戏场景中显示AdMob的横幅
- 如何在3D场景中选择物体并显示轮廓效果
- DirectX3D游戏制作之---3D场景的渲染及人物动画的显示
- [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版
- 3d 道路 场景
- Qt自带OpenGL之3D点云显示问题