# OpenGL Shaders
## Metadata
**Status**:: #x
**Zettel**:: #zettel/fleeting
**Created**:: [[2024-05-11]]
**Reference**:: [[OpenGL Reference]]
## Program
Program is the container of shaders.
```c
// ref §7.3
GLuint glCreateProgram(void);
void glAttachShader(GLuint program, GLuint shader);
void glLinkProgram(GLuint program);
void glUseProgram(GLuint program);
```
Use `glGetProgramiv` with `GL_LINK_STATUS` to query whether the program has been linked successfully.
### Troubleshooting
```c
glLinkProgram(shader_program);
GLint linked = 0;
glGetProgramiv(shader_program, GL_LINK_STATUS, &linked);
if (!linked)
{
// the size includes the NULL
GLint logSize = 0;
glGetProgramiv(shader_program, GL_INFO_LOG_LENGTH, &logSize);
if (logSize > 0)
{
char *errorLog = (char *)malloc(logSize);
glGetProgramInfoLog(shader_program, logSize, NULL, errorLog);
fprintf(stderr, "Error linking program: %s\n", errorLog);
free(errorLog);
}
}
```
## Shader
```c
// ref §7.1
GLuint glCreateShader(GLenum type);
```
Shader types:
- `GL_VERTEX_SHADER`
- `GL_FRAGMENT_SHADER`
### From Source
```c
void glShaderSource(GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
void glCompileShader(GLuint shader);
```
### From Binary
```c
void glShaderBinary(GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
// Spirv format must set entry
glSpecializeShader(shader, "main", 0, NULL, NULL);
```
Binary formats:
- `GL_SHADER_BINARY_FORMAT_SPIR_V`