官方文档:https://docs.gl/es3/glAttachShader
一、描述
Attaches a shader object to a program object.
将着色器对象附加到program对象。
In order to create a complete shader program, there must be a way to specify the list of things that will be linked together. Program objects provide this mechanism. Shaders that are to be linked together in a program object must first be attached to that program object. glAttachShader
attaches the shader object specified by shader
to the program object specified by program
. This indicates that shader
will be included in link operations that will be performed on program
.
All operations that can be performed on a shader object are valid whether or not the shader object is attached to a program object. It is permissible to attach a shader object to a program object before source code has been loaded into the shader object or before the shader object has been compiled. It is not permissible to attach multiple shader objects of the same type. It is permissible to attach a shader object to more than one program object. If a shader object is deleted while it is attached to a program object, it will be flagged for deletion, and deletion will not occur until glDetachShader is called to detach it from all program objects to which it is attached.
为了创建一个可执行文件,必须要有一种方法来指定将被链接在一起的东西的列表。那么,program对象就提供了这么一种机制。
要在program对象中链接的shaders必须首先附加到该program对象上。那glAttachShader方法就是用于将指定的shaders附着到指定的program对象上。这就表明shader将被包含在要被执行的program的链接操作中。
不管shader对象是否被附着到program对象上,在shader对象上执行的所有操作都是有效的。
在源代码加载到着色器对象之前或着色器对象被编译之前,将shader对象附着到program对象上都是被允许的。
多个同类型(例如都是vertex shader类型,或都是fragment shader类型)的shader对象不能被附着到同一个program对象上。但是,单个shader对象可以被附着到多个program对象上。
如果着色器对象在附加到程序对象时被删除,它将被标记为删除,并且直到调用glDetachShader才能将其从它所连接的所有程序对象中分离出来,否则删除将不会发生。
二、C函数
void glAttachShader(
GLuint program, // 指定着色器对象将附加到的program对象。
GLuint shader // 指定要附加的着色器对象。
);
示例
GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vshader, 1, &vertex_shader_source, NULL); // vertex_shader_source is a GLchar* containing glsl shader source code
glCompileShader(vshader);
GLint vertex_compiled;
glGetShaderiv(vshader, GL_COMPILE_STATUS, &vertex_compiled);
if (vertex_compiled != GL_TRUE)
{
GLsizei log_length = 0;
GLchar message[1024];
glGetShaderInfoLog(vshader, 1024, &log_length, message);
// Write the error to a log
}
GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fshader, 1, &fragment_shader_source, NULL); // fragment_shader_source is a GLchar* containing glsl shader source code
glCompileShader(fshader);
GLint fragment_compiled;
glGetShaderiv(fshader, GL_COMPILE_STATUS, &fragment_compiled);
if (fragment_compiled != GL_TRUE)
{
GLsizei log_length = 0;
GLchar message[1024];
glGetShaderInfoLog(fshader, 1024, &log_length, message);
// Write the error to a log
}
GLuint program = glCreateProgram();
// This step is unnecessary if you use the location specifier in your shader
// e.g. layout (location = 0) in vec3 position;
glBindAttribLocation(program, 0, "position"); // The index passed into glBindAttribLocation is
glBindAttribLocation(program, 1, "texcoord"); // used by glEnableVertexAttribArray. "position"
glBindAttribLocation(program, 2, "normal"); // "texcoord" "normal" and "color" are the names of the
glBindAttribLocation(program, 3, "color"); // respective inputs in your fragment shader.
glAttachShader(program, vshader);
glAttachShader(program, fshader);
glLinkProgram(program);
GLint program_linked;
glGetProgramiv(program, GL_LINK_STATUS, &program_linked);
if (program_linked != GL_TRUE)
{
GLsizei log_length = 0;
GLchar message[1024];
glGetProgramInfoLog(program, 1024, &log_length, message);
// Write the error to a log
}
四、错误
GL_INVALID_VALUE
generated if either program or shader is not a value generated by OpenGL.
GL_INVALID_OPERATION
generated if program is not a program object.
generated if shader is not a shader object.
generated if shader is already attached to program.
generated if a shader of the same type as shader is already attached to program.