# 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`