在使用着色器绘制图形时都要执行的着色器和程序的创建、链接相关流程。本文主要来源于《OpenGL ES 3.0编程指南》第四章。
需要创建两个基本对象才能使用着色器进行渲染:着色器对象、程序对象。理解着色器对象和程序对象的最佳方式是将它们比作C语言的编译器和链接程序。C编译器为一段源代码生成目标代码(例如.obj或者.o文件)。创建目标文件之后,C链接程序将对象文件链接为最后的程序。
OpenGL ES在着色器方面使用类似范式。着色器对象是包含单个着色器的对象。源代码提供给着色器对象,然后着色器对象被编译为一个目标形式(类似于.obj文件)。编译之后,着色器对象可以连接到一个程序对象。程序对象可以连接多个着色器对象。在OpenGL ES中,每个程序对象必须连接一个顶点着色器和一个片段着色器(不多也不少)。最后,程序对象被链接为用于渲染的最后“可执行程序”。(这里注意连接和链接的区分)
着色器对象链接步骤
获取链接后的着色器对象的过程,一般包括下面6个步骤:
- 创建一个顶点着色器对象和片段着色器对象
- 将源代码连接到每个着色器对象
- 编译着色器对象
- 创建一个程序对象
- 将编译后的着色器对象连接到程序对象
- 链接程序对象
上述步骤的示例代码如下:
1 | // 顶点着色器源代码 |
示例代码
以创建三角形为例,走下上述创建着色器对象并链接程序的过程,每一步都有基本的注释。对细节不是特别清楚的可以参考这个网站,入门OpenGL非常好的一个教程网站)。
1 | class TriangleRenderer : BaseRenderer() { |
Renderer基类包含一部分检查工作,比如着色器是否创建成功、程序是否链接成功。
1 | abstract class BaseRenderer: GLSurfaceView.Renderer { |