2

上节中讲到GLES中着色器动态编译的流程:

1.创建着色器
2.指定着色器源代码字符串
3.编译着色器
4.创建着色器可执行程序
5.向可执行程序中添加着色器
6.链接可执行程序

着色器渲染中需要使用Shader对象和Program对象两个基本对象,首先每个着色器源码要被加载到一个Shader对象,然后被编译。然后Shader对象被加载到Program对象并执行链接(link),链接后产生可执行的代码。如果一个链接后的P对象呗使用(use),则其中的可执行代码会分别用于顶点和片段的处理。

创建链接着色器

GLuint glCreateShader(GLenum type)
void glDeleteShader(GLuint shader)

type:创建着色器的类型 GL_VERTEX_SHADER 或者 GL_FRAGMENT_SHADER 顶点着色器或片段着色器,返回值是个新着色器的句柄,发生错误则返回0;

glDeleteShader 删除不再使用的着色器。shader要删除的着色器句柄,如果着色器正连接着一个项目对象,glDeleteShader不会立刻删除着色器,而是设置删除标记,一旦着色器不再连接项目对象才删除着色器使用的内存。

void glShaderSource(GLuint shader, GLsizei count, const char** string,const GLint* length)
void glCompileShader(GLuint shader)

创建空着色器后,使用 glShaderSource 提供着色器源码,count指示string数组的个数,length指向整数矩阵的指针,指示每个着色器字符串长度。如果长度为NULL,表示没有这个着色器,如果非空,是每个相应的着色器字符串长度数。如果length小于0,也说明字符串为空。

调用 glCompileShader,编译着色器对象。像其他语言一样,编译后你想知道是否产生错误,可以使用glGetShaderiv查询。

void glGetShaderiv(GLuint shader, GLenum pname,GLint *params)

pname 需要查询的信息GL_COMPILE_STATUS GL_DELETE_STATUS GL_INFO_LOG_LENGTH GL_SHADER_SOURCE_LENGTH GL_SHADER_TYPE;Params 返回查询结果的整型指针。

创建链接程序对象

GLuint glCreateProgram(void)
void glDeleteProgram(GLuint program)

这个函数没输入参数,它返回新建项目的句柄。删除一个项目使用 glDeleteProgram。

void glAttachShader(GLuint program, GLuint shader)
void glDetachShader(GLuint program, GLuint shader)

可以使用glAttachShader连接一个顶点着色器和片段着色器。program项目的句柄;shader着色器句柄。一个着色器对象可以加到多个着色器程序对象,但是同类型的多个着色器对象不能同时加到一个程序对象上。glDetachShader解除附加。

void glLinkProgram(GLuint program)

为了使用着色器,着色器连接后,着色器程序对象必须被链接。使用glLinkProgram,链接后会改变一个GL_LINK_STATUS状态的布尔值,可通过glGetProgramiv查询。

void glGetProgramiv(GLuint program, GLenum pname, GLint *params)
void glUseProgram(GLuint program)

链接成功后,使用glUseProgram激活着色器程序对象。激活成功后,就可以开始渲染了。当使用到DrawArrays或DrawElements时GL渲染管线就会对每个顶点和片段执行我们定义的着色器了。

可以结合上节给出的Director类的代码作为例子学习。


RichardXG
337 声望19 粉丝

引用和评论

0 条评论