Android的OpenGL ES教程 - 第一部分 - 设置视图

公司刚开始做一款游戏项目,需要用到图形绘制方面的知识,考虑到项目简单紧急,决定用OpenGL ES来完成。第一次正式开发游戏,边学边做吧。

参考:Android的OpenGL ES教程 - 第一部分 - 设置视图

在Andorid平台上构造一个OpenGL View非常简单,主要有两方面的工作:

GLSurfaceView

Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.microedition.khronos.opengles ,java.nio 等几个包中,其中类GLSurfaceView 为这些包中的核心类:

起到连接OpenGL ES与Android 的View层次结构之间的桥梁作用。

使得Open GL ES库适应于Anndroid系统的Activity生命周期。

使得选择合适的Frame buffer像素格式变得容易。

创建和管理单独绘图线程以达到平滑动画效果。

提供了方便使用的调试工具来跟踪OpenGL ES函数调用以帮助检查错误。

因此编写OpenGL ES应用的起始点是从类GLSurfaceView开始,设置GLSurfaceView只需调用一个方法来设置OpenGLView用到的GLSurfaceView.Renderer.

1publicvoidsetRenderer(GLSurfaceView.Renderer renderer)

GLSurfaceView.Renderer

GLSurfaceView.Renderer定义了一个统一图形绘制的接口,它定义了如下三个接口函数:

1// Called when the surface is created or recreated.

2publicvoidonSurfaceCreated(GL10 gl, EGLConfig config)

3

4// Called to draw the current frame.

5publicvoidonDrawFrame(GL10 gl)

6

7// Called when the surface changed size.

8publicvoidonSurfaceChanged(GL10 gl,intwidth,intheight)

onSurfaceCreated : 在这个方法中主要用来设置一些绘制时不常变化的参数,比如:背景色,是否打开 z-buffer等。

onDrawFrame:  定义实际的绘图操作。

onSurfaceChanged: 如果设备支持屏幕横向和纵向切换,这个方法将发生在横向<->纵向互换时。此时可以重新设置绘制的纵横比率。

有了上面的基本定义,可以写出一个OpenGL ES应用的通用框架。

创建一个新的Android 项目:OpenGLESTutorial, 在项目在添加两个类TutorialPartI.java 和OpenGLRenderer.java.

具体代码如下:

TutorialPartI.java

1publicclassTutorialPartIextendsActivity {

2// Called when the activity is first created.

3@Override

4publicvoidonCreate(Bundle savedInstanceState) {

5super.onCreate(savedInstanceState);

6this.requestWindowFeature(Window.FEATURE_NO_TITLE);// (NEW)

7getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

8WindowManager.LayoutParams.FLAG_FULLSCREEN);// (NEW)

9

10GLSurfaceView view =newGLSurfaceView(this);

11view.setRenderer(newOpenGLRenderer());

12setContentView(view);

13}

14}

OpenGLRenderer.java

1publicclassOpenGLRendererimplementsRenderer {

2

3publicvoidonSurfaceCreated(GL10 gl, EGLConfig config) {

4// Set the background color to black ( rgba ).

5gl.glClearColor(0.0f,0.0f,0.0f,0.5f);// OpenGL docs.

6// Enable Smooth Shading, default not really needed.

7gl.glShadeModel(GL10.GL_SMOOTH);// OpenGL docs.

8// Depth buffer setup.

9gl.glClearDepthf(1.0f);// OpenGL docs.

10// Enables depth testing.

11gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs.

12// The type of depth testing to do.

13gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs.

14// Really nice perspective calculations.

15gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,// OpenGL docs.

16GL10.GL_NICEST);

17}

18

19

20publicvoidonDrawFrame(GL10 gl) {

21// Clears the screen and depth buffer.

22gl.glClear(GL10.GL_COLOR_BUFFER_BIT |// OpenGL docs.

23GL10.GL_DEPTH_BUFFER_BIT);

24}

25

26

27publicvoidonSurfaceChanged(GL10 gl,intwidth,intheight) {

28// Sets the current view port to the new size.

29gl.glViewport(0,0, width, height);// OpenGL docs.

30// Select the projection matrix

31gl.glMatrixMode(GL10.GL_PROJECTION);// OpenGL docs.

32// Reset the projection matrix

33gl.glLoadIdentity();// OpenGL docs.

34// Calculate the aspect ratio of the window

35GLU.gluPerspective(gl,45.0f,

36(float) width / (float) height,

370.1f,100.0f);

38// Select the modelview matrix

39gl.glMatrixMode(GL10.GL_MODELVIEW);// OpenGL docs.

40// Reset the modelview matrix

41gl.glLoadIdentity();// OpenGL docs.

42}

43}

编译后运行,屏幕显示一个黑色的全屏。这两个类定义了Android OpenGL ES应用的最基本的类和方法,可以看作是OpenGL ES的”Hello ,world”应用,后面将逐渐丰富这个例子来画出3D图型。


框架代码GitHub地址,会不断更新,一起学习吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,310评论 25 707
  • Android平台下OpenGL初步 Android OpenGL ES 开发教程 从入门到精通http://bl...
    garyhu1阅读 1,501评论 1 2
  • 本篇文章是基于谷歌有关Graphic的一篇概览文章的翻译:http://source.android.com/de...
    lee_3do阅读 7,140评论 2 21
  • 目录结构: 第一步,明确要干嘛 第二步,怎么去画(纯理论) 第三步,怎么去画(实战) 第四步,练练手 第一步,明确...
    半纸渊阅读 8,090评论 18 57
  • 拉勾网Lagou “BAT作为互联网三大巨头,一直以来是许多互联网人神往的地方,职业发展道路上不少人把BAT当作黄...
    9f8c8b2539b5阅读 710评论 3 4