aboutsummaryrefslogtreecommitdiff
path: root/src/shader.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-05-11 10:56:19 +0200
committerCharles <sircharlesaze@gmail.com>2020-05-11 10:56:19 +0200
commit0700a8f567ab733a57fe688e45e5092d3fa1c1a0 (patch)
tree019beaec7d2228729877778a7798909a7db69254 /src/shader.c
parent6623e7fbdb4307536d3f5920c267c74f8bc6a989 (diff)
downloadscop-0700a8f567ab733a57fe688e45e5092d3fa1c1a0.tar.gz
scop-0700a8f567ab733a57fe688e45e5092d3fa1c1a0.tar.bz2
scop-0700a8f567ab733a57fe688e45e5092d3fa1c1a0.zip
Shader, first drawing
Diffstat (limited to 'src/shader.c')
-rw-r--r--src/shader.c64
1 files changed, 64 insertions, 0 deletions
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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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);
+}