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

1.4 创建Renderer类

现在要定义一个渲染器,以便我们开始清空屏幕。
让我们快速浏览一下渲染器接口定义的方法:

onSurfaceCreated(GL10 glUnused, EGLConfig config)

当Surface被创建的时候,GLSurfaceView会调用这个方法;这发生在应用程序第一次运行的时候,并且,当设备被唤醒或者用户从其他activity切换回来时,这个方法也可能会被调用。在实践中,这意味着,当应用程序运行时,本方法可能会被调用多次。

onSurfaceChanged(GL10 glUnused, int width, int height)

在Surface被创建以后,每次Surface尺寸变化时,这个方法都会被GLSurfaceView调用到。在横屏、竖屏来回切换的时候,Surface尺寸会发生变化。

onDrawFrame(GL10 glUnused)

当绘制一帧时,这个方法会被GLSurfaceView调用。在这个方法中,我们一定要绘制一些东西,即使只是清空屏幕;因为,在这个方法返回后,渲染缓冲区会被交换并显示在屏幕上,如果什么都没画,可能会看到糟糕的闪烁效果。
怎么会有一个未被使用的参数类型GL10呢?它是OpenGL ES 1.0的API(应用程序编程接口)遗留下来的;如果要编写使用OpenGL ES 1.0的渲染器,就要使用这个参数;但是,对于OpenGL ES 2.0,GLES20类提供了静态方法来存取。
在后台线程中渲染
GLSurfaceView会在一个单独的线程中调用渲染器的方法。默认情况下,GLSurfaceView会以显示设备的刷新频率不断地渲染,当然,它也可以配置为按请求渲染,只需要用
GlSurfaceView.RENDERMODE_WHEN_DIRTY作为参数调用GLSurfaceView.setRenderMode()即可。
既然Android的GLSurfaceView在后台线程中执行渲染,就必须要小心,只能在这个渲染线程中调用OpenGL,在Android主线程中使用UI(用户界面)相关的调用;两个线程之间的通信可以用如下方法:在主线程中的GLSurfaceView实例可以调用queueEvent()方法传递一个Runnable给后台渲染线程,渲染线程可以调用Activity的runOnUIThread()来传递事件(event)给主线程。
新建渲染器
在同一个包里创建一个各为FirstOpenGLProjectRender的新类,用来实现Renderer接口;为了创建这个新类,在包浏览器(package Explorer)里,鼠标右键单击“com.firstopenglproject.android”,接着选择“New→Class”;在弹出的“New Java Class”窗口中输入“FirstOpenGLProjectRenderer”作为名字,并单击“Finish”按钮。
我们会以下面的代码作为开始,并加入我们的第一个方法OnSurfaceCreated():

首先,在onSurfaceCreated()中调用glClearColor(1.0f, 0.0f, 0.0f, 0.0f)设置清空屏幕用的颜色;前三个参数分别对应红色、绿色和蓝色,最后的参数对应一个特殊的分量,称为阿尔法(alpha),它经常用来表示半透明度或透明度。通过把第一个分量设为1,其余设为0,我们把红色设置为最大强度,当屏幕被清空时,它就会显示红色。2.6节会更详细地讨论这个颜色模型。
下一步就是设置视口(viewport)尺寸了,让我们加入如下代码:

在onSurfaceChanged()方法中,调用glViewPort(0, 0, width, height)设置了视口尺寸,这就告诉了OpenGL可以用来渲染的surface的大小。
要用如下代码完成这个渲染器类:

在onDrawFame()中调用glClear(GL_COLOR_BUFFER_BIT)清空屏幕;这会擦除屏幕上的所有颜色,并用之前glClearColor()调用定义的颜色填充整个屏幕。
现在测试一下代码,看看会发生什么。按“Ctrl+F11”键运行这个程序。你会看到一个空白的红色屏幕,如图1-4所示。

尝试改变清空的颜色,然后再运行程序看看会发生什么!你应该看到屏幕上的颜色与代码的改动完全匹配。
如果你使用的是模拟器,且程序不工作,而你也检查过模拟器的配置选项“Use Host GPU”已经被勾选了,那就试试在glSurfaceView.setRenderer()调用之前加入glSurfaceView.setEGLConfigChooser(8,8,8,8,16,0)的调用。

时间: 2024-09-14 14:22:18

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

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

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

《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卷》—— 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卷》—— 1.2 创建第一个程序

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

《OpenGL ES应用开发实践指南:Android卷》—— 2.5 引入OpenGL管道

2.5 引入OpenGL管道 现在,我们已经定义了曲棍球桌子的结构,并且把这些数据复制到了OpenGL可以存取的本地内存:在把曲棍球桌子画到屏幕上之前,它需要在OpenGL的管道(pipeline)中传递,这就需要使用称为着色器(shader)的子例程(见图2-6).这些着色器会告诉图形处理单元(GPU)如何绘制数据.有两种类型的着色器,在绘制任何内容到屏幕之前,需要定义它们.Joe问:什么是字节序字节序(Endianness)是描述一个硬件架构是如何组织位(bit)和字节(byte)的方式,它

《OpenGL ES应用开发实践指南:Android卷》—— 3.2 编译着色器

3.2 编译着色器 现在我们已经把着色器源代码从文件中读出来了,下一步就是编译每个着色器了.我们要创建一个新的辅助类,它可以创建新的OpenGL着色器对象.编译着色器代码并且返回代表那段着色器代码的着色器对象.一旦写出样板代码,在未来的项目中就可以重用了. 作为开始,创建一个名为ShaderHelper的新类,并在类中添加如下代码: 这些代码会作为着色器辅助类的基础.与以前一样,不要忘了把导入加进代码中:如果你在使用静态导入时碰到什么问题,请参考1.5节:在本书的剩余部分,我们会一直遵循这个样式

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

3.1 加载着色器 我们既然已经为着色器写了代码,下一步就要把它们加载到内存中:为此,我们首先需要写一个可以从资源文件夹读取那些代码的方法. 3.1.1 从资源中加载文本 在项目中创建一个新的Java源代码包,命名为"com.airhockey.android.util",在这个包中创建一个名为"TextResourceReader"的新类.在类中加入如下代码: 我们已经定义了一个方法从资源中读取文本,该方法就是readTextFileFromResource().

《OpenGL ES应用开发实践指南:Android卷》—— 1.6 小结

1.6 小结 在本章,我们学习了如何创建一个新的OpenGL项目和清空屏幕.我们安装及配置了开发环境.创建了一个新项目.初始化了OpenGL.响应了Android Activity的生命周期,最后清空了屏幕!我们现在有一个基础了,后面的所有项目都能以此为基础来构建.休息片刻.在下面的两章里,我们会继续在这个基础上构建,学习如何为GPU编程,并加入更多特性.准备好了吗?让我们继续学习下一章.