| 313 | } |
| 314 | |
| 315 | LfShader shader_prg_create(const char* vert_src, const char* frag_src) { |
| 316 | // Creating vertex & fragment shader with the shader API |
| 317 | uint32_t vertex_shader = shader_create(GL_VERTEX_SHADER, vert_src); |
| 318 | uint32_t fragment_shader = shader_create(GL_FRAGMENT_SHADER, frag_src); |
| 319 | |
| 320 | // Creating & linking the shader program with OpenGL |
| 321 | LfShader prg; |
| 322 | prg.id = glCreateProgram(); |
| 323 | glAttachShader(prg.id, vertex_shader); |
| 324 | glAttachShader(prg.id, fragment_shader); |
| 325 | glLinkProgram(prg.id); |
| 326 | |
| 327 | // Check for linking errors |
| 328 | int32_t linked; |
| 329 | glGetProgramiv(prg.id, GL_LINK_STATUS, &linked); |
| 330 | |
| 331 | if(!linked) { |
| 332 | LF_ERROR("Failed to link shader program."); |
| 333 | char info[512]; |
| 334 | glGetProgramInfoLog(prg.id, 512, NULL, info); |
| 335 | LF_INFO("%s", info); |
| 336 | glDeleteShader(vertex_shader); |
| 337 | glDeleteShader(fragment_shader); |
| 338 | glDeleteProgram(prg.id); |
| 339 | return prg; |
| 340 | } |
| 341 | |
| 342 | // Delete the shaders after |
| 343 | glDeleteShader(vertex_shader); |
| 344 | glDeleteShader(fragment_shader); |
| 345 | return prg; |
| 346 | } |
| 347 | |
| 348 | void shader_set_mat(LfShader prg, const char* name, mat4 mat) { |
| 349 | glUniformMatrix4fv(glGetUniformLocation(prg.id, name), 1, GL_FALSE, mat[0]); |
no test coverage detected