首先了解下着色器:着色器是一段包含着色信息的源代码字符串,分为顶点着色器和片元着色器,两个着色器分别写在不同的文件中。
着色器代码和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已经是编译好的二进制)。
标签:OpenGL,Shader,GLES,编译,Program,着色器,shader From: https://www.cnblogs.com/xue0708/p/15689859.html