Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- GLint CompileShader(GLuint shader, LPCSTR path)
- {
- FILE *f = fopen(path, "rb");
- if (!f)
- return GL_FALSE;
- fseek(f,0,SEEK_END);
- GLint len = ftell(f);
- fseek(f,0,SEEK_SET);
- GLchar *data = (GLchar*)malloc(len);
- if (!data)
- {
- fclose(f);
- return GL_FALSE;
- }
- int readed = fread(data, 1, len, f);
- fclose(f);
- if (readed != len)
- {
- free(data);
- return GL_FALSE;
- }
- GLchar* strings[1];
- strings[0] = data;
- glShaderSource(shader, 1, (const GLchar**)strings, &len);
- free(data);
- glCompileShader(shader);
- GLint success = 0;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
- return success;
- }
- void PrintShaderLog(GLuint shader, LPCSTR path)
- {
- GLint logSize = 0;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logSize);
- GLchar *infoLog = (GLchar*)malloc(logSize);
- if (!infoLog)
- return;
- GLsizei len;
- glGetShaderInfoLog(shader, logSize, &len, infoLog);
- FILE *log = fopen(path, "wb");
- if (log)
- {
- fwrite(infoLog, 1, len, log);
- fclose(log);
- }
- free(infoLog);
- }
- GLint CompileProgram(GLuint program, GLuint vertex, GLuint fragment)
- {
- glAttachShader(program, vertex);
- glAttachShader(program, fragment);
- glLinkProgram(program);
- GLint success = 0;
- glGetProgramiv(program, GL_LINK_STATUS, &success);
- return success;
- }
- void PrintProgramLog(GLuint shader, LPCSTR path)
- {
- GLint logSize = 0;
- glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &logSize);
- GLchar *infoLog = (GLchar*)malloc(logSize);
- if (!infoLog)
- return;
- GLsizei len = 0;
- glGetProgramInfoLog(shader, logSize, &len, infoLog);
- FILE *log = fopen(path, "wb");
- if (log)
- {
- fwrite(infoLog, 1, len, log);
- fclose(log);
- }
- free(infoLog);
- }
- GLuint MakeProgram(LPCSTR vert_path, LPCSTR frag_path)
- {
- GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
- GLint res = CompileShader(vertex, vert_path);
- PrintShaderLog(vertex, "vert.log");
- if (res == GL_FALSE)
- {
- glDeleteShader(vertex);
- return res;
- }
- GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
- res = CompileShader(fragment, frag_path);
- PrintShaderLog(fragment, "frag.log");
- if (res == GL_FALSE)
- {
- glDeleteShader(vertex);
- glDeleteShader(fragment);
- return res;
- }
- GLuint program = glCreateProgram();
- res = CompileProgram(program, vertex, fragment);
- PrintProgramLog(program, "prog.log");
- glDetachShader(program, vertex);
- glDetachShader(program, fragment);
- glDeleteShader(vertex);
- glDeleteShader(fragment);
- return program;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement