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)。为了打开或关闭这些记录,我们所需要做的就是更新这个常量值并重新编译这个程序。