着色器:着色器是提供给用户定制自己特殊渲染需求的一套机制。常用接口如下:
1.GLuint glCreateShader(GLenum type)
:创建指定类型的着色器。创建成功时会返回一个当前着色器的唯一标志。
.type指着色器类型。通常取GL_VERTEX_SHADER(顶点着色器),GL_FRAGMENT_SHADER(片段着色器),GL_GEOMETRY_SHADER(几何着色器)等类型中的一种。
2.void glShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, const GLint* length)
:将着色器源码附加到着色器对象上。
.shader表示着色器唯一标志。
.count表示着色器源码字符串的个数。
.string表示着色器源码字符串的内容数组。
.length表示着色器源码字符串的长度数组,当为NULL时表示每个源码字符串以NULL结尾。
3.void glCompileShader(GLuint shader)
:编译着色器。
.shader表示着色器唯一标志。
4.void glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
:检测着色器操作状态是否成功。
.shader表示着色器唯一标志。
.pname表示操作状态类型。可以是GL_COMPILE_STATUS(编译状态),GL_LINK_STATUS(链接状态),GL_DELETE_STATUS(删除状态)等操作状态中的一种。
.params就是检测的结果。成功就会返回GL_TRUE,否则就会返回GL_FALSE。
5.void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog)
:获取着色器错误消息。
.shader表示着色器唯一标志。
.bufSize表示错误消息容器大小。
.infoLog表示错误消息容器。
.length表示错误消息长度大小。当为NULL时就不返回错误消息长度。
6.void glDeleteShader(GLuint shader)
:删除着色器。当着色器以及链接到一个或者多个激活的着色器程序上时,此时着色器就被标记为“可删除”状态,直到着色器程序不再使用时,当前的着色器才会被自动删除。
.shader表示着色器唯一标志。
7.GLboolean gllsShader(GLuint shader)
:判定指定着色器是否存在。
.shader表示着色器唯一标志。
着色器程序:着色器程序是多个着色器合并之后并最终链接完成的版本。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。常用接口如下:
1.GLuint glCreateProgram(void)
:创建着色器程序。创建成功时会返回一个当前着色器程序的唯一标志。
2.void glAttachShader(GLuint program, GLuint shader)
:将着色器附加到着色器程序上。
.program表示着色器程序唯一标志。
.shader表示着色器唯一标志。
3.void glDetachShader(GLuint program, GLuint shader)
:从着色器程序中移除指定的着色器。
.program表示着色器程序唯一标志。
.shader表示着色器唯一标志。
4.void glLinkProgram(GLuint program)
:链接着色器程序中的着色器。此时每个着色器的输出会链接到下个着色器的输入。当输出和输入不匹配的时候,你会得到一个连接错误。
.program表示着色器程序唯一标志。
5.void glGetProgramiv(GLuint program, GLenum pname, GLint* params)
:检测着色器程序操作状态是否成功。
.program表示着色器程序唯一标志。
.pname表示操作状态类型。可以是GL_COMPILE_STATUS(编译状态),GL_LINK_STATUS(链接状态),GL_DELETE_STATUS(删除状态)等操作状态中的一种。
.params就是检测的结果。成功就会返回GL_TRUE,否则就会返回GL_FALSE。
6.void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog)
:获取着色器程序错误消息。
.program表示着色器程序唯一标志。
.bufSize表示错误消息容器大小。
.infoLog表示错误消息容器。
.length表示错误消息长度大小。当为NULL时就不返回错误消息长度。
7.void glUseProgram(GLuint program)
:激活着色器程序对象,默认情况下是非激活状态的。
.program表示着色器程序唯一标志。当为0时,那么所有当前使用的着色器都会被清除。
8.void glDeleteProgram(GLuint program)
:删除着色器程序。当着色器程序被某一个环境所使用时,着色器程序就被标记为“可删除”状态,直到没有环境使用该着色器程序时,就会自动被移除。
.program表示着色器程序唯一标志。
9.GLboolean gllsProgram(GLuint program)
:判定指定着色器程序是否存在。
.program表示着色器程序唯一标志。
着色器子程序:类似于C语言中的函数指针,主要用来实现子程序的动态选择。
声明着色器子程序集合流程如下:
1.通过关键字subroutine来定义着色器子程序类型。
原型如下所示:
subroutine returnType subroutineType(type param, ...);
其中returnType表示函数返回类型,subroutineType表示函数名称,param表示指定类型type的函数参数名。
参考定义如下所示:
subroutine vec4 LightFunc(vec3);
2.通过关键字subroutine并结合第一步中定义好的着色器子程序类型来定义着色器子程序内容。
原型如下所示:
subroutine (subroutineType1, subroutineType2, ...) returnType funcName(...);
其中subroutineType1和subroutineType2代表的是不同的着色器子程序类型,returnType代表函数返回类型,funcName表示函数名。
参考定义如下所示:
subroutine (LightFunc) vec4 ambient(vec3 n);
subroutine (LightFunc) vec4 diffuse(vec3 n);
3.通过关键字subroutine和uniform来定义一个保存选择着色器子程序信息的变量。
原型如下所示:
subroutine uniform subroutineType varName;
其中subroutineType表示着色器子程序类型,varName表示着色器子程序变量名
参考定义如下所示:
subroutine uniform LightFunc materialShader;
选择着色器子程序流程如下:
1.GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const char* name)
:获取指定着色器子程序uniform变量名称的索引位置。
.program代表着色器程序。当不可用时返回GL_INVALID_OPERATION。
.shadertype代表着色器类型。通常是GL_VERTEX_SHADER(顶点着色器),GL_FRAGMENT_SHADER(片段着色器),GL_GEOMETRY_SHADER(几何着色器)等类型中的一种。
.name代表着色器子程序uniform变量名称。当该变量不可用时返回-1。
2.GLint glGetSubroutineIndex(GLuint program, GLenum shadertype, const char* name)
:获取指定着色器子程序函数名称的索引位置。
.program代表着色器程序。当不可用时返回GL_INVALID_OPERATION。
.shadertype代表着色器类型。通常是GL_VERTEX_SHADER(顶点着色器),GL_FRAGMENT_SHADER(片段着色器),GL_GEOMETRY_SHADER(几何着色器)等类型中的一种。
.name代表着色器子程序函数名称。当该函数不可用时返回GL_INVALID_INDEX。
3.GLuint glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint* indices)
:设置着色器子程序uniform变量的值为指定的着色器子程序函数。
.shadertype代表着色器类型。通常是GL_VERTEX_SHADER(顶点着色器),GL_FRAGMENT_SHADER(片段着色器),GL_GEOMETRY_SHADER(几何着色器)等类型中的一种。
.count表示着色器子程序个数。
.indices表示着色器子程序uniform变量索引为key,着色器子程序函数索引为value的数组。