编译
// 创建着色器对象
GLuint id = glCreateShader(GL_VERTEX_SHADER);
// 传入着色器源码
glShaderSource(id, 1, &source_chars, NULL);
// 编译着色器
glCompileShader(id);
// 获取编译状态
GLint success_flag;
glGetShaderiv(id, GL_COMPILE_STATUS, &success_flag);
if (success_flag == GL_FALSE) {
char info_log[512];
// 获取编译日志
glGetShaderInfoLog(id, 512, NULL, info_log);
printf("着色器编译错误: %s", info_log);
}glCreateShader
创建一个着色器对象
GLuint glCreateShader(GLenum shader_type)- 参数:
shader_type—— 着色器类型GL_VERTEX_SHADER—— 顶点着色器GL_TESS_CONTROL_SHADER—— 细分控制着色器GL_TESS_EVALUATION_SHADER—— 细分验证着色器GL_GEOMETRY_SHADER—— 几何着色器GL_FRAGMENT_SHADER—— 片段着色器GL_COMPUTE_SHADER—— 计算着色器
- 返回值:着色器对象ID
glShaderSource
传入着色器源码
void glShaderSource(
GLuint shader,
GLsizei count,
const GLchar* const *string,
const GLint *length,
)- 参数:
shader—— 着色器对象IDcount—— 传入的源码字符串片段数量string—— 着色器源码内容,可传入多个字符串;类型为char*的指针,即可传入char*[]length—— 字符串长度的指针,可传入int[];通常传入NULL,表示字符串以\0结尾
- 无返回值 着色器源码分段传入示例:
// 共用的Uniforms
const char* CommonUniforms = "xxx\n";
// 代码主体
const char* MainCode = "xxx\n";
// 组合字符串片段
const char* sources[] = { "#version 460\n", CommonUniforms, MainCode };
// 调用glShaderSource
glShaderSource(id, 3, sources, NULL);当然将字符串合并之后再传入也是可以的,但要注意传入的参数string、length类型均为指针。
glCompileShader
执行编译着色器源码
void glCompileShader(GLuint shader)- 参数:
shader—— 着色器对象ID
- 无返回值
glGetShaderiv
查询有关特定着色器状态的信息,比如编译状态、信息日志长度等
void glGetShaderiv(
GLuint shader,
GLenum pname,
GLint *param,
);- 参数:
shader—— 着色器对象IDpname—— 要查询的着色器参数GL_COMPILE_STATUS—— 着色器编译状态(GL_TRUE/GL_FALSE)GL_DELETE_STATUS—— 着色器是否被标记删除(GL_TRUE/GL_FALSE)GL_SHADER_TYPE—— 着色器类型(参考glCreateShader)GL_INFO_LOG_LENGTH—— 与该着色器相关的日志的长度(包括终止符)GL_SHADER_SOURCE_LENGTH—— 着色器源码长度- …
params—— 一个指向用于存储返回值的变量指针
- 无返回值
glGetShaderInfoLog
获取与指定着色器相关的日志内容
void glGetShaderInfoLog(
GLuint shader,
GLsizei bufSize,
GLsizei *length,
GLchar *infoLog,
)- 参数:
shader—— 着色器对象IDbufSize—— 最大读取的内容长度length—— 一个指向用于存储本次实际读取到的内容长度的变量指针infoLog—— 一个指向用于存储日志内容的指针
- 无返回值
链接
GLuint id = glCreateProgram();
glAttachShader(id, vertex_shader_id);
glAttachShader(id, fragment_shader_id);
glLinkProgram(id);
GLint success_flag;
glGetProgramiv(id, GL_LINK_STATUS, &success_flag);
if(!success) {
char info_log[512];
glGetProgramInfoLog(id, 512, NULL, info_log);
}glCreateProgram
创建一个着色器程序
GLuint glCreateProgram()- 返回值:着色器程序对象ID
glAttachShader
将已编译的着色器附加到着色器程序
void glAttachShader(GLuint program, GLuint shader)- 参数:
program—— 着色器程序对象IDshader—— 已编译的着色器对象ID
- 无返回值
glGetProgramiv
查询有关特定程序对象状态的信息,比如链接状态、验证状态、附加的着色器数量等
void glGetProgramiv(
GLuint program,
GLenum pname,
GLint *params,
);
- 参数:
program—— 程序对象IDpname—— 要查询的程序参数GL_LINK_STATUS—— 程序链接状态(GL_TRUE/GL_FALSE)GL_DELETE_STATUS—— 程序是否被标记删除(GL_TRUE/GL_FALSE)GL_ATTACHED_SHADERS—— 附加到程序的着色器数量GL_ACTIVE_ATTRIBUTES—— 程序中活跃的属性变量数量GL_ACTIVE_UNIFORMS—— 程序中活跃的uniform变量数量GL_INFO_LOG_LENGTH—— 与该程序相关的日志的长度(包括终止符)- …
params—— 指向存储返回值的变量指针
- 无返回值