《OpenGL ES应用开发实践指南:Android卷》—— 3.1 加载着色器

3.1 加载着色器

我们既然已经为着色器写了代码,下一步就要把它们加载到内存中;为此,我们首先需要写一个可以从资源文件夹读取那些代码的方法。

3.1.1 从资源中加载文本

在项目中创建一个新的Java源代码包,命名为“com.airhockey.android.util”,在这个包中创建一个名为“TextResourceReader”的新类。在类中加入如下代码:

我们已经定义了一个方法从资源中读取文本,该方法就是readTextFileFromResource()。它的工作原理就是在程序代码中通过传递Android上下文(context)及资源标识符(resource ID)调用readTextFileFromResource()。为了存取资源标识符,Android上下文是必需的。例如,要读入片段着色器,我们需要用代码readTextFileFromSource(this.context, R.raw.simple_fragment_shader)使用这个方法。
我们也在代码中检测了两个可能遇到的一般情形:资源可能不存在,或者读取资源时发生错误。这些情况发生时,要捕捉错误并抛出封装好的异常(exception),这些异常对发生的错误进行了解释。如果代码失败并且抛出了一个异常,通过查看异常的消息和栈轨迹(stack trace),就能更好地知道发生了什么事情。
另外,别忘了按组合键“Ctrl+Shift+O”(在Mac上是“”)把代码中要用的导入(import)加进来。

3.1.2 读入着色器的代码

我们现在就要加入一些调用真正地读取着色器的代码。切换到AirHockeyRender.java文件,并在onSurfaceCreated()中的glClearColor()调用后面加入如下代码:

别忘了加入TextResourceReader的导入。因为我们还没有一个Android上下文的引用,这段代码还无法编译。在类的顶部加入如下代码:

像下面这样改变构造函数的起始行:

我们也不得不改变AirHockeyActivity.java,把Android上下文的引用传递进去;打开AirHockeyActivity.java,按如下方式改变glSurfaceView.setRenderer()的调用:

一个Activity组件就是Android的上下文,因此,把this的引用传递进去。

3.1.3 记录发生的一切

当我们开始撰写更复杂的代码时,万一在某处犯了错误,查看事情发生的轨迹会很有帮助。在Android里,我们可以使用Log类把所有的事情记录在系统日志(System log)中,这些记录可以在Eclipse的Logcat视图中看到。
我们并不总是想记录所有的事情,因此,我们在com.airhockey.android.util包中用如下代码添加了一个称为LoggerConfig的新类:

我们无论何时想要记录一些事情时,就要检查这个常量是真值(true)还是假值(false)。为了打开或关闭这些记录,我们所需要做的就是更新这个常量值并重新编译这个程序。

时间: 2024-11-01 15:39:34

《OpenGL ES应用开发实践指南:Android卷》—— 3.1 加载着色器的相关文章

《OpenGL ES应用开发实践指南:Android卷》—— 导读

前 言 Android刚刚经历了一个难以置信的增长周期,全世界的消费者手里有超过7.5亿台设备,并且每天都有一百多万台设备被激活.和Apple一样,在每一台Android手机和平板上也有个集中的市场,称为Google Play.随着这个市场被安装到每台Android设备上,对任何一个梦想着发布自己的游戏或者壁纸的人来说,这都是个前所未有的机会. 在Android上,与Apple的iOS及许多其他移动平台一样,开发者可以使用一个跨平台应用编程接口创建二维或者三维图形,这个接口称为OpenGL:Op

《OpenGL ES应用开发实践指南:Android卷》—— 3.3 把着色器一起链接进OpenGL的程序

3.3 把着色器一起链接进OpenGL的程序 既然我们已经加载并编译了一个顶点着色器和一个片段着色器,下一步就是把它们绑定在一起放入一个单个的程序(program)里. 3.3.1 理解OpenGL的程序 简单来说,一个OpenGL程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象.顶点着色器和片段着色器总是一起工作的.没有片段着色器,OpenGL就不知道怎么绘制那些组成每个点.直线和三角形的片段:如果没有顶点着色器,OpenGL就不知道在哪里绘制这些片段.我们知道顶点着色器计算屏幕

《OpenGL ES应用开发实践指南:Android卷》—— 第2章 定义顶点和着色器

第2章 定义顶点和着色器 本章介绍我们的第一个项目:一个简单的空气曲棍球游戏.在我们开发这个项目的过程中,会学习到一些主要的OpenGL组件.作为起始,我们会学习如何使用独立的点集合构建物体,这些点称为顶点:之后,我们会学习怎样使用着色器绘制这些物体,以及告诉OpenGL如何绘制这些物体的一些小程序.顶点和着色器这两个概念极其重要,因为每个物体的构建都是通过顶点的聚合形成点.直线和三角形,并且这些基本图形都要使用着色器绘制.我们会首先学习顶点,这样就可以构建空气曲棍球游戏中用到的桌子,并且使用O

《OpenGL ES应用开发实践指南:Android卷》—— 1.1 安装工具

1.1 安装工具 下面是开发Android OpenGL所需要的基本工具列表: 一台运行Windows.OS X或者Linux的计算机 Java开发包(JDK) Android软件开发包(SDK) 集成开发环境(IDE) 一个手机.平板电脑或者支持OpenGL ES 2.0的模拟器 你需要的第一个工具是一台适合开发的个人计算机:任何较新的计算机都可以,它需要能运行Windows.OS X或者Linux.在这台计算机上,你需要安装Java开发包,可以从Oracle的网站下载:当前,Google指定

《OpenGL ES应用开发实践指南:Android卷》—— 1.4 创建Renderer类

1.4 创建Renderer类 现在要定义一个渲染器,以便我们开始清空屏幕.让我们快速浏览一下渲染器接口定义的方法: onSurfaceCreated(GL10 glUnused, EGLConfig config) 当Surface被创建的时候,GLSurfaceView会调用这个方法:这发生在应用程序第一次运行的时候,并且,当设备被唤醒或者用户从其他activity切换回来时,这个方法也可能会被调用.在实践中,这意味着,当应用程序运行时,本方法可能会被调用多次. onSurfaceChang

《OpenGL ES应用开发实践指南:Android卷》—— 3.4 做最后的拼接

3.4 做最后的拼接 我们在前两章中用了很大篇幅为这个应用打下了很好的基础:我们学习了如何使用属性数组定义一个物体的结构,也学习了如何创建着色器.加载并编译它们,以及把它们链接起来形成一个OpenGL的程序. 现在是时候在这个基础上开始构建并把它们拼接起来了.在下面的几个步骤里,我们就要把这些部分拼在一起,并准备好把第一个版本的空气曲棍球桌子画到屏幕上. 3.4.1 验证OpenGL程序的对象 在开始使用OpenGL的程序之前,我们首先应该验证一下它,看看这个程序对于当前的OpenGL状态是不是

《OpenGL ES应用开发实践指南:Android卷》—— 1.3 初始化OpenGL

1.3 初始化OpenGL 下一步就是使用一个特殊的类GLSurfaceView初始化OpenGL.GLSurfaceView会处理OpenGL初始化过程中比较基本的操作,如配置显示设备(display)以及在后台线程中渲染:渲染是在显示设备中一个称为"surface"的特定区域完成的,有时也称为视口(viewport).GLSurfaceView类也使得处理标准Android Activity生命周期变得容易了:在Android里,任何Activity都可以创建(create)和销毁

《OpenGL ES应用开发实践指南:Android卷》—— 2.1 为什么选择空气曲棍球

2.1 为什么选择空气曲棍球 空气曲棍球是一个简单.流行的游戏,经常可以在保龄球馆和酒吧里见到它.尽管简单,但非常容易让人上瘾.在Android的应用市场--Google Play里,一些顶级游戏都是基于该游戏或者其他令人愉快的游戏的变种.随着空气曲棍球游戏开发的讲解,我们会学习很多OpenGL概念.我们会学习如何定义和绘制一个可以玩游戏的桌子,以及如何添加一些细节,如颜色.着色器和纹理.我们也会学习如何通过执行触屏事件响应用户操作. 游戏规则要玩空气曲棍球游戏,我们需要一个有两个球门的长方形桌

《OpenGL ES应用开发实践指南:Android卷》—— 1.2 创建第一个程序

1.2 创建第一个程序 我们已经安装并配置了工具,现在来创建第一个OpenGL程序.这个程序非常简单:它要做的只是初始化OpenGL并不停地清空屏幕:要得到一个可以实际做点什么的OpenGL程序,这是我们需要的最少的内容.Joe 问:为什么要不停地清空屏幕如果已经在每一帧的屏幕上都绘制了内容,清空屏幕好像是浪费的,那为什么还要这样做呢?回到一切都用软件渲染的时代,清空屏幕总是一种浪费:开发者总是要假定所有东西都已经绘制好了,并能覆盖前一帧的内容,而不必清空它,这样就能达到优化的目的:可以节省清空