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

3.3 把着色器一起链接进OpenGL的程序

既然我们已经加载并编译了一个顶点着色器和一个片段着色器,下一步就是把它们绑定在一起放入一个单个的程序(program)里。

3.3.1 理解OpenGL的程序

简单来说,一个OpenGL程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象。顶点着色器和片段着色器总是一起工作的。没有片段着色器,OpenGL就不知道怎么绘制那些组成每个点、直线和三角形的片段;如果没有顶点着色器,OpenGL就不知道在哪里绘制这些片段。
我们知道顶点着色器计算屏幕上每个顶点的最终位置。我们也知道当OpenGL把这些顶点组织成点、直线和三角形并且分解成片段的时候,它就会向片段着色器询问每个片段最后的颜色。顶点和片段着色器一起合作生成屏幕上最终的图像。
虽然顶点着色器和片段着色器总是要一起工作,但并不意味着它们必须是一对一匹配的,我们可以同时在多个程序中使用同一个着色器。
让我们打开ShaderHelper,并在类的结尾加入如下代码:

与我们构建compileShader()所做的一样,我们也将一步一步地构建这个方法。它的大部分代码都在概念上与compileShader()相似。

3.3.2 新建程序对象并附上着色器

我们要做的第一件事情就是调用glCreateProgram()新建程序对象,并把那个对象的ID存进programObjectId。让我们加入如下代码:

这个语义同我们早前创建一个新的着色器对象是一样的:返回的整型值是程序对象的引用,如果对象创建失败,我们就会得到返回值0。
下一步就是附上着色器:

使用glAttachShader()方法把顶点着色器和片段着色器都附加到程序对象上。

3.3.3 链接程序

现在准备把这些着色器联合起来了,为此,将调用glLinkProgram(programObjectId):

为了检查这个链接是成功还是失败,我们会遵循编译着色器时所使用的步骤:

首先创建了一个新的整型数组来容纳这个结果,然后调用glGetProgramiv(programObjectId, GLES20.GL_LINK_STATUS, linkStatus, 0)把结果存入这个数组。我们也会检查这个程序的信息日志,这样,如果什么地方出错了或者OpenGL有些关于这个程序有用的内容,我们就能在Android的日志输出中看到:

3.3.4 验证链接状态并返回程序对象ID

现在需要检查链接状态:如果它是0,就意味着这个链接失败,这个程序对象将无法被使用,因此要把它删除并返回0给调用代码:

我们已经讲了这么多了,如果这个程序链接成功了,就可以在代码中使用它了。现在完成了,因此让我们返回这个新的程序对象给调用代码:

3.3.5 给渲染类加入代码

既然我们已经有代码把这些着色器链接在一起了,让我们继续,从程序中调用它。首先在AirHockeyRenderer的顶部加入如下成员变量:

这个整型值用来存储那个链接的程序的ID。在onSurfaceCreated()的结尾处加入如下代码把着色器链接起来:

现在也许该拿起一杯咖啡,让你的大脑休息片刻了。在下一节,我们将开始做最后的拼接,并把数据链接到OpenGL。

时间: 2024-08-13 07:54:56

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

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

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

《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.5 引入OpenGL管道

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

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

2.7 小结 本章用大量篇幅只介绍了如何定义数据,以及沿着OpenGL管道移动数据的着色器.让我们花点儿时间复习一下本章学到的那些关键概念:首先,我们学习了如何定义一个顶点属性数组,并把这个数组复制到本地内存里,以便OpenGL存取它.然后,我们写了一个顶点着色器和一个片段着色器:并了解到一个着色器只是可以运行在GPU上的一个特殊类型的程序.在下一章里,我们会在本章的基础上继续开发:在下一章的结尾处,我们就能看到空气曲棍球桌子了,也将为进一步的练习做好准备.我们将以学习如何读入和编译定义过的着色

《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卷》—— 2.4 使数据可以被OpenGL存取

2.4 使数据可以被OpenGL存取 我们已经完成顶点的定义了,但是,在OpenGL可以存取它们之前,我们仍然需要完成另外一步.主要的问题是这些代码运行的环境与OpenGL运行的环境使用了不同的语言,我们需要理解如下两个主要的概念.1.当我们在模拟器或者设备上编译和运行Java代码的时候,它并不是直接运行在硬件上的:相反,它运行在一个特殊的环境上,即Dalvik虚拟机(Dalvik virtual machine):运行在虚拟机上的代码不能直接访问本地环境(native environment)

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

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