OpenGLES应用开发实践指南Android卷-(三)编译着色器以及在屏幕上绘图

1.加载着色器

1.1 从资源中加载文本

创建名为TextResourceReader的新类,如图所示:
在这里插入图片描述

1.2 读入着色器代码

加入调用真正地读取着色器的代码。切换到AirHockeyRenderer.java文件,并在onSurfaceCreated()中的glClearColor()调用后面加入如下代码:
在这里插入图片描述
在类的顶部加入如下代码:
在这里插入图片描述
改变构造函数的起始行:
在这里插入图片描述
打开AirHockeyActivity.java,把android上下文的引用传递进去;按如下方法改变glSurfaceView.setRenderer()的调用:
在这里插入图片描述

1.3 记录发生 的一切

添加如下LoggerConfig的新类:
在这里插入图片描述
无论何时想要记录一些事情时,就要检查这个常量时true还是false。打开或者关闭这些记录,需要我们自己修改这个常量。

2.编译着色器

创建一个名为ShaderHelper的 新类,并添加如下代码:
在这里插入图片描述

2.1 创建一个新的着色器对象

创建一个新的着色器对象,并检查是否创建成功
在compileShader()中加入如下代码:
在这里插入图片描述
用glCreateShader()调用创建一个对象,这个调用会返回这个对象的ID赋值给shaderObjectId
记住我们是如何创建对象并检查它是否有效的;这个模式是在OpenGL里广泛使用:

  1. 首先使用一个如glCreateShader() 一样调用创建一个对象,这个调用会返回一个整型值(integer)。
  2. 这个整型值就是OpenGL对象的引用。无论后面什么时候想要引用这个对象,就要把这个征信值传回OpenGL。
  3. 返回值0表示这个对象创建失败。
2.2 上传和编译着色器源代码

加入如下代码吧着色器源码上传到着色器对象里,然后再编译她:
在这里插入图片描述

2.3 取出编译状态

继续加入如下代码:
在这里插入图片描述

2.4 取出着色器信息日志

继续加入如下代码:
在这里插入图片描述

2.5 验证编译状态并返回着色器对象ID

继续加入如下代码:
在这里插入图片描述
最后添加:
在这里插入图片描述

2.6 在Renderer类中编译着色器

切换到AirHockeyRenderer.java,并在onSurfaceCreated()结尾处加入如下代码:
在这里插入图片描述

3.把着色器一起链接进OpenGL程序

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

3.1 理解OpenGL的程序

简单来说,一个OpenGL程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象。虽然顶点着色器和片段着色器总是要一起工作,但并不意味着它们必须是一对一匹配的,我们可以同时在多个程序中使用同一个着色器。
打开ShaderHelper,并在类的结尾加入如下代码:
在这里插入图片描述
这个跟compileShader()构建的差不多一样

3.2 懒得解释了,看图

在这里插入图片描述

3.3 给渲染类加入代码

既然我们已经有代码把这些着色器链接在一起了,我们继续,从程序中调用它。在AirHockeyRenderer的顶部加入如下成员变量:
在这里插入图片描述
这个整型值用来存储那个链接的程序的ID。在onSurfaceCreated()的结尾处加入如下代码把着色器连接起来:
在这里插入图片描述

4.做最后的拼接

在ShaderHelper中加入如下代码:
在这里插入图片描述

在AirHockeyRenderer的onSurfaceCreated()结尾处加入如下代码

在这里插入图片描述
AirHockeyRenderer的顶部添加如下:
在这里插入图片描述

5.在屏幕上绘制

在这里插入图片描述
运行起来如下图:
在这里插入图片描述

6.小结

  • 如何创建和编译着色器
  • 顶点着色器和片段着色器总是一起工作的,也学到了如何把它们链接到一起形成一个OpenGL程序对象。
  • 如何把一个顶点着色器内部的属性变量与顶点属性数组关联起来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and The Pragmatic Programmers, LLC was aware of a trademark claim, the designations have been printed in initial capital letters or in all capitals. The Pragmatic Starter Kit, The Pragmatic Programmer, Pragmatic Programming, Pragmatic Bookshelf, PragProg and the linking g device are trademarks of The Pragmatic Programmers, LLC. Every precaution was taken in the preparation of this book. However, the publisher assumes no responsibility for errors or omissions, or for damages that may result from the use of information (including program listings) contained herein. Our Pragmatic courses, workshops, and other products can help you and your team create better software and have more fun. For more information, as well as the latest Pragmatic titles, please visit us at http://pragprog.com. The Android robot is reproduced from work created and shared by Google and is used according to terms described in the Creative Commons 3.0 Attribution License (http://creativecommons.org/licenses/by/3.0/us/legalcode). The unit circle image in Figure 43, from http://en.wikipedia.org/wiki/File:Unit_circle.svg, is used according to the terms described in the Creative Commons Attribution-ShareAlike license, located at http://creativecommons.org/licenses/by-sa/3.0/legalcode. Day skybox and night skybox courtesy of Jockum Skoglund, also known as hipshot, hipshot@zfight.com,http://www.zfight.com. The image of the trace capture button is created and shared by the Android Open Source Project and is used according to terms described in the Creative Commons 2.5 Attribution License.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值