OpenGL-GLES 1.x

首先了解下着色器:着色器是一段包含着色信息的源代码字符串,分为顶点着色器和片元着色器,两个着色器分别写在不同的文件中。

着色器代码和OpenGL代码不是一起编译的,OpenGL代码是和工程一起编译,但是着色器代码是在运行期编译的。

 

OpenGL中,存在Program和Shader两个概念。

Program:当前渲染管线所使用的程序,是Shader的容器,可以挂载多个Shader。

Shader:相当于一个模块,首先需要对Shader脚本进行编译,然后将编译好的Shader挂载到Program上,在OpenGL的渲染中使用Program来使Shader生效。

 

整个流程其实就是创建Shader和创建Program两个子流程。

创建Shader的流程如下:

glCreateShader():创建一个Shader对象。

glShaderSource():创建加载Shader脚本源码。

glCompileShader():编译Shader脚本,compiler的part0和part1阶段。

然后创建好的Shader挂载到Program中,创建Program的流程如下:

glCreateProgram():创建一个Program对象。

glAttachShader():将创建好的Shader进行挂载。

glLinkProgram():执行链接操作,compiler的part2阶段,该阶段有很多类似LTO的多shader的优化。

最后在需要使用Shader时,调用glUseerProgram()应用当前Shader,glDrawElements() 画出对应的draw。

 

GLES1.x版本

但是在GLES1.x版本中,是固定功能流水管线的,因此没有program,提供固定模式的shader供用户选择。

固定模式的shader在预编译prebuild阶段已经编译完成。

用户会定义shader state,并通过Driver传给compiler,compiler根据state选择已编译完成的vs片段拼接在一起,返回给driver,完成绘图。

 

流程:

Driver在prepare_draw的时候,根据api_version决定GLES的版本。

如果是GLES_API_2,准备program module,对应shader已经在glCompilerShader阶段编译好,生成对应的metadata。 

如果是GLES_API_1,准备生成着色器的模块,基于shader state,确定vs中哪些功能函数/特性被打开,生成metadata,并确定fs。最后通过link_program将vs和fs组成一个pipeline (此时拿到的vs fs已经是编译好的二进制)。

 

posted @ 2023-02-17 16:12  为取经而来  阅读(73)  评论(0编辑  收藏  举报