OpenGl 3.0
着色器
glCreateShader
创建着色器句柄, 返回一个非 0 的 shader 句柄
GLuint glCreateShader (GLenum type);
type 着色器类型有2种, 顶点着色器
和片段着色器
GL_VERTEX_SHADER
GL_FRAGMENT_SHADER
glShaderSource
定义着色器的代码源
void glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
- shader 着色器对象的句柄(ID)
- count 指定字符串和长度数组中的元素数
- string 指定指向包含要加载到着色器的源代码的字符串的指针数组
- length 指定字符串长度的数组
glCompileShader
void glCompileShader(GLuint shader);
编译着色器
glGetShaderiv
从着色器句柄返回一个参数
void glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
-
shader 着色器对象的句柄(ID)
-
pname 指定着色器对象的参数(可以使用类型如下: )
-
GL_SHADER_TYPE
:
shader_type:着色器类型
用来判断并返回着色器类型,若是顶点着色器返回GL_VERTEX_SHADER,若为片元着色器返回GL_FRAGMENT_SHADER. -
GL_DELETE_STATUS
:
detele status:删除状态
判断着色器是否被删除,是返回GL_TRUE,否则返回GL_FALSE, -
GL_COMPILE_STATUS
:
compile_status:编译状态
用于检测编译是否成功,成功为GL_TRUE,否则为GL_FALSE. -
GL_INFO_LOG_LENGTH
:
information log length: log是日志的意思,所以是返回着色器的信息日志的长度
用于返回着色器的信息日志的长度,包括空终止字符(即存储信息日志所需的字符缓冲区的大小)。 如果着色器没有信息日志,则返回值0。 -
GL_SHADER_SOURCE_LENGTH
:
SHADER_SOURCE_LENGTH:着色器源码长度
返回着色器源码长度,不存在则返回0;
-
-
params
该函数的返回值的地址(错误返回值如下: )
-
GL_INVALID_ENUM
: pname不是一个可接受的值。 -
GL_INVALID_VALUE
: shader不是OpenGL生成的值。 -
GL_INVALID_OPERATION
: 不支持着色器编译器的情况下查询 pname 为 GL_COMPILE_STATUS,GL_INFO_LOG_LENGTH 或 GL_SHADER_SOURCE_LENGTH(GL_SHADER_TYPE,GL_DELETE_STATUS 不会报这个错)
-
glGetShaderInfoLog
返回着色器对象的信息日志
void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- shader 着色器对象的句柄(ID)
- bufSize 指定用于存储返回的信息日志的字符缓冲区的大小
- length 返回 infoLog 中返回的字符串的长度(不需要可以传 nullptr )
- infoLog 指定用于返回信息日志的字符数组
glDeleteShader
删除着色器句柄
void glDeleteShader (GLuint shader);
shader 着色器对象的句柄(ID)
程序
glCreateProgram
创建程序, 返回一个非 0 的 program
GLuint glCreateProgram (void);
glAttachShader
将着色器对象附加到program对象
void glAttachShader (GLuint program, GLuint shader);
- program 着色器的 program
- shader 着色器对象的句柄(ID)
glLinkProgram
链接 program
void glLinkProgram (GLuint program);
- program 着色器的 program
glGetProgramiv
从program对象返回一个参数的值
void glGetProgramiv (GLuint program, GLenum pname, GLint *params);
-
program 着色器的 program
-
pname 指定program对象参数(可以使用类型如下: )
-
GL_DELETE_STATUS
如果program当前标记为删除,则params返回 GL_TRUE,否则返回GL_FALSE。
-
GL_LINK_STATUS
如果program的最后一个链接操作成功,则params返回GL_TRUE,否则返回GL_FALSE。
-
GL_VALIDATE_STATUS
params返回GL_TRUE,program的最后一次验证操作成功了也返回GL_TRUE,否则返回GL_FALSE
-
GL_INFO_LOG_LENGTH
params返回program信息日志中的字符数,包括空终止字符(即,存储信息日志所需的字符缓冲区的大小)。 如果程序没有信息日志,则返回值0。
-
GL_ATTACHED_SHADERS
params返回附加到program的着色器对象的数量。
-
GL_ACTIVE_ATTRIBUTES
params返回program的激活状态的属性变量数。
-
GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
params返回program的最长激活状态的属性名称的长度,包括空终止字符(即,存储最长属性名称所需的字符缓冲区的大小)。 如果不存在活动属性,则返回0。
-
GL_ACTIVE_UNIFORMS
params返回program的激活状态的统一变量的数量。
-
GL_ACTIVE_UNIFORM_MAX_LENGTH
params返回program*的最长激活状态的统一变量名称的长度,包括空终止字符(即,存储最长统一变量名称所需的字符缓冲区的大小)。 如果不存在活动的统一变量,则返回0。
-
-
该方法的返回值
glGetProgramInfoLog
返回 program 对象的信息日志
void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- program 着色器的 program
- bufSize 指定用于存储返回的信息日志的字符缓冲区的大小
- length 返回 infoLog 中返回的字符串的长度(不需要可以传 nullptr )
- infoLog 指定用于返回信息日志的字符数组
glDeleteProgram
删除 program
void glDeleteProgram (GLuint program);
glGetAttribLocation
获取顶点属性变量(位置、纹理、颜色、法线)在着色器程序中的位置索引
GLint glGetAttribLocation (GLuint program, const GLchar *name);
- program 着色器的 program
- name 要查询其位置的属性变量的名称
glUseProgram
使用 program
void glUseProgram (GLuint program);
glVertexAttribPointer
指定了渲染时索引值为 index 的顶点属性数组的数据格式和位置
void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-
index 顶点属性的索引, 如果使用了 layout(location = numer) 那么这个 index 就是 number , 如果没有指定,
可以使用
glGetAttribLocation
查询index
-
size 顶点的属性大小, 如果是 vec4 那么就是 4 , 如果是 vec2 那么就是 2
-
type 指定数据的类型, 一般是 GL_FLOAT
-
normalized 使用归一化, 如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE
-
stride 顶点属性的间隔, 使用上面的 size * sizeof(float)
-
pointer 顶点数组
glEnableVertexAttribArray
允许顶点着色器读取GPU(服务器端)数据
void glEnableVertexAttribArray (GLuint index);
-
index 顶点属性的索引, 如果使用了 layout(location = numer) 那么这个 index 就是 number , 如果没有指定,
可以使用
glGetAttribLocation
查询index
glGetUniformLocation
返回统一变量的位置
GLint glGetUniformLocation (GLuint program, const GLchar *name);
- program 着色器的 program
- name 要查询其位置的统一变量的名称
颜色
glClear
当前缓冲区清除值
void glClear (GLbitfield mask);
-
mask
可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位
GL_COLOR_BUFFER_BIT
: 当前可写的颜色缓冲GL_DEPTH_BUFFER_BI
T: 深度缓冲GL_ACCUM_BUFFER_BIT
: 累积缓冲GL_STENCIL_BUFFER_BIT
: 模板缓冲
glClearColor
设置清除颜色
void glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
glClearDepthf
指定深度缓冲区的清除值
void glClearDepthf (GLfloat d);
- d 深度 返回 [0,1]
glClearStencil
指定模板缓冲区的清除值
void glClearStencil (GLint s);
- s 指定清除模板缓冲区时使用的索引。 初始值为0。
绘图
glDrawElements
使用 count 个元素定义一个几何序列
void glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
- mode 可以是
GL_POLYGON、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_LINE_STRIP
等。 - count 一般是点的个数
- type 指 indices 数组的数据类型, 一般是整型
- indices 索引数组
glDrawArrays
提供绘制功能。当采用顶点数组方式绘制图形时,使用该函数。该函数根据顶点数组中的坐标数据和指定的模式,进行绘制
void glDrawArrays (GLenum mode, GLint first, GLsizei count);
- mode 可以是
GL_POLYGON、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_LINE_STRIP
等。 - first 从数组缓存中的哪一位开始绘制, 一般都为 0
- count 数组中顶点的数量
纹理
glGenTextures
生成纹理索引
void glGenTextures (GLsizei n, GLuint *textures);
- n 生成纹理的数量
- textures 存储纹理索引的第一个元素指针
glBindTexture
允许建立一个绑定到目标纹理的有名称的纹理
void glBindTexture (GLenum target, GLuint texture);
- target 纹理被绑定的目标, 它的取值为
GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D、GL_TEXTURE_CUBE_MAP
- texture 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。
glTexParameterf
OpenGL纹理过滤函数
void glTexParameterf (GLenum target, GLenum pname, GLfloat param);
- target 纹理被绑定的目标, 它的取值为
GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D、GL_TEXTURE_CUBE_MAP
- pname 此为要设置的纹理参数, 可以取值如下:
GL_TEXTURE_MAG_FILTER,GL_TEXTURE_MIN_FILTER,GL_TEXTURE_WRAP_S,GL_TEXTURE_WRAP_T
- param 要设置的纹理参数的值
pname 和 param 对应关系
pname | param |
---|---|
GL_TEXTURE_MAG_FILTER | GL_NEAREST、GL_LINEAR |
GL_TEXTURE_MIN_FILTER | GL_NEAREST、GL_LINEAR、GL_NEAREST_MIPMAP_NEAREST、GL_NEAREST_MIPMAP_LINEAR、GL_LINEAR_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_LINEAR |
GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T | GL_REPEAT、GL_CLAMP_TO_EDGE、GL_MIRRORED_REPEAT |
glActiveTexture
选择当前活跃的纹理单元
glActiveTexture
的实际范围可以通过GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
查询。这是最大可用的纹理单元数。它们被分为几组,给不同的shader阶段。比如 GL 3.x, 顶点着色器分得 16 个纹理单元,几何着色器和片元着色器同样也有16个。因此,GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 查询得到的最大值为48。
glActiveTexture(GL_TEXTURE0 + i); where i is a number between 0 and GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.
因此你应该这样调用 glActiveTexture(GL_TEXTURE0 + i);i 为 0 到 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS的整数
void glActiveTexture (GLenum texture);
- texture 纹理枚举值
glTexImage2D
根据指定的参数,生成一个2D纹理, 在调用该函数之前,必须调用glBindTexture(GL_TEXTURE_2D, mTextureID );以指定要操作的纹理ID,此处是mTextureID
void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
- target 指定目标纹理,这个值必须是GL_TEXTURE_2D
- level 执行细节级别。0是最基本的图像级别,n表示第N级贴图细化级别
- internalformat 指定纹理中的颜色组件。可选的值有
GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA
等几种 - width 指定纹理图像的宽度,必须是2的n次方。纹理图片至少要支持64个材质元素的宽度
- height 指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度
- border 指定边框的宽度。必须为0
- format 像素数据的颜色格式, 不需要和 internalformatt 取值必须相同。可选的值参考 internalformat
- type 指定像素数据的数据类型。可以使用的值有
GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1
- pixels 指定内存中指向图像数据的指针
glUniform1i
纹理层和采样器地址进行绑定
void glUniform1i (GLint location, GLint v0);
- location 着色器里的 layout 指定的值,如果没有指定使用, glGetUniformLocation 查询获取的值
- v0 纹理层级 (从 0 开始)