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

简介:

本节书摘来自华章出版社《OpenGL ES应用开发实践指南:Android卷》一 书中的第3章,第3.3节,作者:(美)Kevin Brothaler ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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

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

3.3.1 理解OpenGL的程序

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

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

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

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

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

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

3.3.3 链接程序

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

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

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

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

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

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

3.3.5 给渲染类加入代码

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

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

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

相关文章
|
27天前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
1月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
2月前
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
73 3
|
2月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
95 0
|
17天前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
1月前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!
|
1月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
1月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1月前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。