编译

C
// 创建着色器对象
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

创建一个着色器对象

C
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

传入着色器源码

C
void glShaderSource(
	GLuint shader,
	GLsizei count,
	const GLchar* const *string,
	const GLint *length,
)
点击展开查看更多
  • 参数
    • shader —— 着色器对象ID
    • count —— 传入的源码字符串片段数量
    • string —— 着色器源码内容,可传入多个字符串;类型为char*的指针,即可传入char*[]
    • length —— 字符串长度的指针,可传入int[];通常传入NULL,表示字符串以\0结尾
  • 无返回值 着色器源码分段传入示例
C
// 共用的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);
点击展开查看更多

当然将字符串合并之后再传入也是可以的,但要注意传入的参数stringlength类型均为指针。

glCompileShader

执行编译着色器源码

C
void glCompileShader(GLuint shader)
点击展开查看更多
  • 参数
    • shader —— 着色器对象ID
  • 无返回值

glGetShaderiv

查询有关特定着色器状态的信息,比如编译状态、信息日志长度等

C
void glGetShaderiv(
	GLuint shader,
	GLenum pname,
	GLint *param,
);
点击展开查看更多
  • 参数
    • shader —— 着色器对象ID
    • pname —— 要查询的着色器参数
      • 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

获取与指定着色器相关的日志内容

C
void glGetShaderInfoLog(
	GLuint shader,
	GLsizei bufSize,
	GLsizei *length,
	GLchar *infoLog,
)
点击展开查看更多
  • 参数
    • shader —— 着色器对象ID
    • bufSize —— 最大读取的内容长度
    • length —— 一个指向用于存储本次实际读取到的内容长度的变量指针
    • infoLog —— 一个指向用于存储日志内容的指针
  • 无返回值

链接

C
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

创建一个着色器程序

C
GLuint glCreateProgram()
点击展开查看更多
  • 返回值:着色器程序对象ID

glAttachShader

已编译的着色器附加到着色器程序

C
void glAttachShader(GLuint program, GLuint shader)
点击展开查看更多
  • 参数
    • program —— 着色器程序对象ID
    • shader —— 已编译的着色器对象ID
  • 无返回值

glGetProgramiv

查询有关特定程序对象状态的信息,比如链接状态、验证状态、附加的着色器数量等

C
void glGetProgramiv(
	GLuint program,
	GLenum pname,
	GLint *params,
);  
点击展开查看更多
  • 参数
    • program —— 程序对象ID
    • pname —— 要查询的程序参数
      • 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 —— 指向存储返回值的变量指针
  • 无返回值

glGetProgramInfoLog

参考glGetShaderInfoLog

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/4bfbc27c/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键