X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=program.cpp;fp=program.cpp;h=b1f2edeb52d2c210985fb24dadfe843d78d8c5de;hp=0000000000000000000000000000000000000000;hb=c44e69ec78367fb2957324026894aef970f2481a;hpb=85f8f7278f24fe73fef1a19174376b155319072f diff --git a/program.cpp b/program.cpp new file mode 100644 index 0000000..b1f2ede --- /dev/null +++ b/program.cpp @@ -0,0 +1,50 @@ +#include "program.hpp" +#include +#include +#include + +using namespace std; + +void attachShader(GLuint progId, string filePath, GLenum type) { + GLuint shader = glCreateShader(type); + + if (!shader) { + cerr << "error creating shader" << endl; + exit(1); + } + + ifstream file(filePath); + stringstream buffer; + buffer << file.rdbuf(); + string str = buffer.str(); + const char* contents = str.c_str(); + + glShaderSource(shader, 1, (const GLchar**)&contents, NULL); + glCompileShader(shader); + GLint success; + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if (!success) { + GLchar log[1024]; + glGetShaderInfoLog(shader, 1024, NULL, log); + fprintf(stderr, "error: %s\n", log); + exit(1); + } + glAttachShader(progId, shader); +} + +Program::Program(const string vertexShader, const string fragmentShader) { + progId = glCreateProgram(); + + attachShader(progId, vertexShader, GL_VERTEX_SHADER); + attachShader(progId, fragmentShader, GL_FRAGMENT_SHADER); + + glLinkProgram(progId); + GLint success = 0; + glGetProgramiv(progId, GL_LINK_STATUS, &success); + if (!success) { + GLchar log[1024]; + glGetProgramInfoLog(progId, sizeof(log), NULL, log); + fprintf(stderr, "error linking: %s\n", log); + exit(1); + } +}