目录
名词解释
一、VAO
VAO的全称是vertex array object 顶点数组对象,存在与内存中。
二、VBO
VBO的全称是vertex buffer object 顶点缓存对象,存在于GPU缓存区
三、shader
shader着色器程序,可以使用普通字符串来存储,这个没有任何问题,只是不便于阅读和书写。
也可以是用文件来存储,文件后缀可以任意取,一般以vsh、fsh、glsl作为文件后缀,如:
shader.vsh:顶点着色器程序文件(vertex shader)
shader.fsh:片元着色器程序文件(fragment shader)
GLSL流程
一、基本流程
需要创建2个基本对象才能用着色器进⾏渲染: 着色器对象 和 程序对象。
获取链接着⾊器对象的一般过程包括6个步骤
1、创建⼀个顶点着⾊器对象和⼀个⽚段着⾊器对象
2、将源代码链接到每个着⾊器对象
3、编译着⾊器对象
4、创建⼀个程序对象
5、将编译后的着⾊器对象连接到程序对象
6、链接程序对象
二、部分API解析
1、
GLuint glCreateShader(GLenum type);
type:创建着色器的类型,GL_VERTEX_SHADER 或者GL_FRAGMENT_SHADER
返回值:是指向新着⾊器对象的句柄.可以调用glDeleteShader 删除
2、
void glDeleteShader(GLuint shader);
shader:要删除的着⾊器对象句柄
3、
void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint *length);
shader — 指向着⾊器对象的句柄
count — 着⾊器源字符串的数量,着⾊器可以由多个源字符串组成,但是每个着⾊器只有⼀个main函数
string — 指向保存数量的count 的着⾊器源字符串的数组指针
length — 指向保存每个着⾊器字符串⼤小且元素数量为count 的整数数组指针.
4、
void glCompileShader(GLuint shader);
shader — 需要编译的着⾊器对象句柄
5、
void glGetShaderiv(GLuint shader , GLenum pname , GLint *params );
shader — 需要编译的着⾊器对象句柄
pname — 获取的信息参数,可以为 GL_COMPILE_STATUS/GL_DELETE_STATUS/ GL_INFO_LOG_LENGTH/GL_SHADER_SOURCE_LENGTH/ GL_SHADER_TYPE
params — 指向查询结果的整数存储位置的指针.
6、
void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog);
shader — 需要获取信息⽇志的着⾊器对象句柄
maxLength — 保存信息⽇志的缓存区⼤小
length — 写⼊的信息⽇志的⻓度(减去null 终⽌止符); 如果不需要知道⻓度. 这个参数可以为Null
infoLog — 指向保存信息日志的字符缓存区的指针.
7、
GLUint glCreateProgram( )
创建⼀个程序对象
返回值: 返回一个执行新程序对象的句柄
8、
void glDeleteProgram( GLuint program )
program : 指向需要删除的程序对象句柄
9、着⾊色器器与程序连接/附着
void glAttachShader( GLuint program , GLuint shader );
program : 指向程序对象的句柄
shader : 指向程序连接的着⾊器对象的句柄
10、断开连接
void glDetachShader(GLuint program);
program : 指向程序对象的句柄
shader : 指向程序断开连接的着⾊器对象句柄
11、
glLinkProgram(GLuint program)
program: 指向程序对象句柄
12、链接程序之后, 需要检查链接是否成功. 你可以使⽤glGetProgramiv 检查链接状态:
void glGetProgramiv (GLuint program,GLenum pname, GLint *params);
program: 需要获取信息的程序对象句柄
pname : 获取信息的参数,可以是:
GL_ACTIVE_ATTRIBUTES
GL_ACTIVE_ATTRIBUTES_MAX_LENGTH
GL_ACTIVE_UNIFORM_BLOCK
GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH
GL_ACTIVE_UNIFROMS
GL_ACTIVE_UNIFORM_MAX_LENGTH
GL_ATTACHED_SHADERS
GL_DELETE_STATUS
GL_INFO_LOG_LENGTH
GL_LINK_STATUS
GL_PROGRAM_BINARY_RETRIEVABLE_HINT
GL_TRANSFORM_FEEDBACK_BUFFER_MODE
GL_TRANSFORM_FEEDBACK_VARYINGS
GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
GL_VALIDATE_STATUS
params : 指向查询结果整数存储位置的指针
13、从程序信息⽇日志中获取信息
void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog )
program : 指向需要获取信息的程序对象句柄
maxLength : 存储信息⽇志的缓存区⼤小
length : 写⼊的信息⽇志长度(减去null 终⽌止符),如果不需要知道长度,这个参数可以为Null.
infoLog : 指向存储信息日志的字符缓存区的指针
14、
void glUseProgram(GLuint program)
program: 设置为活动程序的程序对象句句柄.
数据类型
类型 | 描述 |
vec2,vec3,vec4 | 2分量、3分量、4分量 浮点向量 |
ivec2,ivec3,ivec4 | 2分量、3分量、4分量 整型向量 |
uvec2,uvec3,uvec4 | 2分量、3分量、4分量 ⽆无符号整型向量 |
bvec2,bvec3,bvec4 | 2分量、3分量、4分量 bool型向量 |
mat2,mat2x2 | 两⾏两列 |
mat2x3 | 三行两列 |
行者常至,为者常成!