JHHK

欢迎来到我的个人网站
行者常至 为者常成

11、GLSL初探

目录

名词解释

一、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 三行两列

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.