From 0700a8f567ab733a57fe688e45e5092d3fa1c1a0 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 11 May 2020 10:56:19 +0200 Subject: Shader, first drawing --- src/shader.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/shader.c (limited to 'src/shader.c') diff --git a/src/shader.c b/src/shader.c new file mode 100644 index 0000000..4934dcd --- /dev/null +++ b/src/shader.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shader.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/05/11 09:35:54 by charles #+# #+# */ +/* Updated: 2020/05/11 10:54:14 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "scop.h" + +#define SHADER_VERTEX_FILEPATH "shader/vertex.glsl" +#define SHADER_FRAGMENT_FILEPATH "shader/fragment.glsl" + +static unsigned int st_compile(char *filepath, unsigned int type) +{ + char *src; + unsigned int id; + int result; + int len; + char *msg; + + if ((src = ft_getfile(open(filepath, O_RDONLY))) == NULL) + return (0); + GL_CALL(id = glCreateShader(type)); + GL_CALL(glShaderSource(id, 1, (const char**)&src, NULL)); + free(src); + GL_CALL(glCompileShader(id)); + GL_CALL(glGetShaderiv(id, GL_COMPILE_STATUS, &result)); + if (result == GL_FALSE) + { + GL_CALL(glGetShaderiv(id, GL_INFO_LOG_LENGTH, &len)); + if ((msg = malloc(sizeof(char) * (len + 1))) == NULL) + return (0); + GL_CALL(glGetShaderInfoLog(id, len, &len, msg)); + ft_putendl(msg); + free(msg); + GL_CALL(glDeleteShader(id)); + return (0); + } + return (id); +} + +unsigned int shader_new(void) +{ + unsigned int shader_vertex; + unsigned int shader_fragment; + unsigned int program; + + if ((shader_vertex = st_compile(SHADER_VERTEX_FILEPATH, GL_VERTEX_SHADER)) == 0 + || (shader_fragment = st_compile(SHADER_FRAGMENT_FILEPATH, GL_FRAGMENT_SHADER)) == 0) + return (0); + GL_CALL(program = glCreateProgram()); + GL_CALL(glAttachShader(program, shader_vertex)); + GL_CALL(glAttachShader(program, shader_fragment)); + GL_CALL(glLinkProgram(program)); + GL_CALL(glValidateProgram(program)); + GL_CALL(glDeleteShader(shader_vertex)); + GL_CALL(glDeleteShader(shader_fragment)); + return (program); +} -- cgit