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程序对象。
  • 如何把一个顶点着色器内部的属性变量与顶点属性数组关联起来
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章