1.创建一个shader容器
GLES20.glCreateShader(shaderType);
函数原型为:
int glCreateShader (int type)
方法参数:
GLES20.GL_VERTEX_SHADER (顶点shader)
GLES20.GL_FRAGMENT_SHADER (片元shader)
返回值:
函数将返回一个整形的正整数作为shader容器的id。
2.加载shader的源代码
GLES20.glShaderSource(shader, source);
要在创建好的shader容器中添加shader的源代码。源代码应该以字符串数组的形式表示。当然,也可以只用一个字符串来包含所有的源代码。
函数的原型:
void glShaderSource (int shader, String string)
方法参数:
shader是代表shader容器的id(由glCreateShader返回的整形数);
strings是包含源程序的字符串数组;
3.编译shader
GLES20.glCompileShader(shader);
使用glCompileShader函数来对shader容器中的源代码进行编译。
函数的原型如下:
void glCompileShader (int shader)
参数含义:
shader是代表shader容器的id
4.调试
4.1 编译阶段使用glGetShaderiv获取编译情况
函数原型: void glGetShaderiv (int shader, int pname, int[] params, int offset) 参数含义: shader是一个shader的id; pname使用GL_COMPILE_STATUS; params是返回值,如果一切正常返回GL_TRUE代,否则返回GL_FALSE。
4.2编译阶段使用glGetShaderInfoLog获取编译错误
函数原型: String glGetShaderInfoLog (int shader) 参数含义: shader是一个顶点shader或者片元shader的id。
4.3 在连接阶段使用glGetProgramiv获取连接情况
函数原型: void glGetProgramiv (int program, int pname, int[] params, int offset) 参数含义: program是一个着色器程序的id; pname是GL_LINK_STATUS; param是返回值,如果一切正常返回GL_TRUE代,否则返回GL_FALSE。
4.4 在连接阶段使用glGetProgramInfoLog获取连接错误
函数原型: String glGetProgramInfoLog (int program) 参数含义: program是一个着色器程序的id。
5.清理shader
当不再需要某个shader或某个程序的时候,需要对其进行清理,以释放资源。
函数原型:
void glDeleteShader (int shader)
参数含义:
shader是要被排除的顶点shader或者片元shader的id
6.创建程序对象
int program = GLES20.glCreateProgram();
函数原型: int glCreateProgram () 如果函数调用成功将返回一个正整数作为该着色器程序的id。
7.Shader连接程序对象
//向程序中加入顶点着色器 GLES20.glAttachShader(program, vertexShader);//向程序中加入片元着色器 GLES20.glAttachShader(program, pixelShader);
函数原型: void glAttachShader (int program, int shader) 参数含义: program是着色器程序容器的id; shader是要添加的顶点或者片元shader容器的id。
8.链接程序
函数原型: void glLinkProgram (int program) 参数含义: program是着色器程序容器的id。
9.使用链接好的程序
如果将program设置为0,表示使用固定功能管线。
函数原型: void glUseProgram (int program) 参数含义: program是要使用的着色器程序的id。
参考:
http://www.tuicool.com/articles/VZVJra
http://fengmm521.blog.163.com/blog/static/2509135820133254936364/