-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathshader.cpp
More file actions
88 lines (73 loc) · 2.68 KB
/
shader.cpp
File metadata and controls
88 lines (73 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Make sure we include stdio first to make fopen to work on android
#include <stdio.h>
#include <memory.h>
#include "shader.h"
#include "log.h"
#include <iostream>
#include <sstream>
#include <vector>
#include <map>
#include <string>
char* readWholeFile(const std::string& filename)
{
auto file = fopen(filename.c_str(), "r");
if (file != nullptr)
{
fseek(file, 0, SEEK_END);
auto size = ftell(file);
fseek(file, 0, SEEK_SET);
char* buffer = (char*)malloc(size + 1);
memset(buffer, 0, size + 1);
fread(buffer, sizeof(char), size + 1, file);
fclose(file);
return buffer;
}
return nullptr;
}
GLuint LoadShaderProgram(const char* vertShaderSrc, const char* fragShaderSrc)
{
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
GLint result = GL_FALSE;
GLint logLength;
glShaderSource(vertShader, 1, &vertShaderSrc, NULL);
glCompileShader(vertShader);
// Check vertex shader
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
Log::Current().Error("compiling vertex shader");
glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength);
std::vector<GLchar> vertShaderError(static_cast<size_t>((logLength > 1) ? logLength : 1));
glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]);
Log::Current().Error(&vertShaderError[0]);
}
glShaderSource(fragShader, 1, &fragShaderSrc, NULL);
glCompileShader(fragShader);
// Check fragment shader
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
Log::Current().Error("compiling fragment shader");
glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength);
std::vector<GLchar> fragShaderError(static_cast<size_t>((logLength > 1) ? logLength : 1));
glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]);
Log::Current().Error(&fragShaderError[0]);
}
GLuint program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &result);
if (result == GL_FALSE)
{
Log::Current().Error("linking program");
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
std::vector<GLchar> programError(static_cast<size_t>((logLength > 1) ? logLength : 1));
glGetProgramInfoLog(program, logLength, NULL, &programError[0]);
Log::Current().Error(&programError[0]);
}
glDeleteShader(vertShader);
glDeleteShader(fragShader);
return program;
}