diff options
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 228 |
1 files changed, 114 insertions, 114 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 99d5389..d0d2b75 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -56,11 +56,11 @@ static GLuint mesh_normalbuffer; | |||
56 | static int mesh_numvertices; | 56 | static int mesh_numvertices; |
57 | 57 | ||
58 | GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) | 58 | GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) |
59 | { | 59 | { |
60 | // Create the shaders | 60 | // Create the shaders |
61 | GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); | 61 | GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); |
62 | GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); | 62 | GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); |
63 | 63 | ||
64 | // Read the Vertex Shader code from the file | 64 | // Read the Vertex Shader code from the file |
65 | std::string VertexShaderCode; | 65 | std::string VertexShaderCode; |
66 | std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); | 66 | std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); |
@@ -71,7 +71,7 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) | |||
71 | VertexShaderCode += "\n" + Line; | 71 | VertexShaderCode += "\n" + Line; |
72 | VertexShaderStream.close(); | 72 | VertexShaderStream.close(); |
73 | } | 73 | } |
74 | 74 | ||
75 | // Read the Fragment Shader code from the file | 75 | // Read the Fragment Shader code from the file |
76 | std::string FragmentShaderCode; | 76 | std::string FragmentShaderCode; |
77 | std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); | 77 | std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); |
@@ -81,53 +81,53 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) | |||
81 | FragmentShaderCode += "\n" + Line; | 81 | FragmentShaderCode += "\n" + Line; |
82 | FragmentShaderStream.close(); | 82 | FragmentShaderStream.close(); |
83 | } | 83 | } |
84 | 84 | ||
85 | GLint Result = GL_FALSE; | 85 | GLint Result = GL_FALSE; |
86 | int InfoLogLength; | 86 | int InfoLogLength; |
87 | 87 | ||
88 | // Compile Vertex Shader | 88 | // Compile Vertex Shader |
89 | printf("Compiling shader : %s\n", vertex_file_path); | 89 | printf("Compiling shader : %s\n", vertex_file_path); |
90 | char const * VertexSourcePointer = VertexShaderCode.c_str(); | 90 | char const * VertexSourcePointer = VertexShaderCode.c_str(); |
91 | glShaderSource(VertexShaderID, 1, &VertexSourcePointer , nullptr); | 91 | glShaderSource(VertexShaderID, 1, &VertexSourcePointer , nullptr); |
92 | glCompileShader(VertexShaderID); | 92 | glCompileShader(VertexShaderID); |
93 | 93 | ||
94 | // Check Vertex Shader | 94 | // Check Vertex Shader |
95 | glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); | 95 | glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); |
96 | glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); | 96 | glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); |
97 | std::vector<char> VertexShaderErrorMessage(InfoLogLength); | 97 | std::vector<char> VertexShaderErrorMessage(InfoLogLength); |
98 | glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]); | 98 | glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]); |
99 | fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); | 99 | fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); |
100 | 100 | ||
101 | // Compile Fragment Shader | 101 | // Compile Fragment Shader |
102 | printf("Compiling shader : %s\n", fragment_file_path); | 102 | printf("Compiling shader : %s\n", fragment_file_path); |
103 | char const * FragmentSourcePointer = FragmentShaderCode.c_str(); | 103 | char const * FragmentSourcePointer = FragmentShaderCode.c_str(); |
104 | glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , nullptr); | 104 | glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , nullptr); |
105 | glCompileShader(FragmentShaderID); | 105 | glCompileShader(FragmentShaderID); |
106 | 106 | ||
107 | // Check Fragment Shader | 107 | // Check Fragment Shader |
108 | glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); | 108 | glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); |
109 | glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); | 109 | glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); |
110 | std::vector<char> FragmentShaderErrorMessage(InfoLogLength); | 110 | std::vector<char> FragmentShaderErrorMessage(InfoLogLength); |
111 | glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]); | 111 | glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]); |
112 | fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); | 112 | fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); |
113 | 113 | ||
114 | // Link the program | 114 | // Link the program |
115 | fprintf(stdout, "Linking program\n"); | 115 | fprintf(stdout, "Linking program\n"); |
116 | GLuint ProgramID = glCreateProgram(); | 116 | GLuint ProgramID = glCreateProgram(); |
117 | glAttachShader(ProgramID, VertexShaderID); | 117 | glAttachShader(ProgramID, VertexShaderID); |
118 | glAttachShader(ProgramID, FragmentShaderID); | 118 | glAttachShader(ProgramID, FragmentShaderID); |
119 | glLinkProgram(ProgramID); | 119 | glLinkProgram(ProgramID); |
120 | 120 | ||
121 | // Check the program | 121 | // Check the program |
122 | glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); | 122 | glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); |
123 | glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); | 123 | glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); |
124 | std::vector<char> ProgramErrorMessage( glm::max(InfoLogLength, int(1)) ); | 124 | std::vector<char> ProgramErrorMessage( glm::max(InfoLogLength, int(1)) ); |
125 | glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]); | 125 | glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]); |
126 | fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); | 126 | fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); |
127 | 127 | ||
128 | glDeleteShader(VertexShaderID); | 128 | glDeleteShader(VertexShaderID); |
129 | glDeleteShader(FragmentShaderID); | 129 | glDeleteShader(FragmentShaderID); |
130 | 130 | ||
131 | return ProgramID; | 131 | return ProgramID; |
132 | } | 132 | } |
133 | 133 | ||
@@ -135,14 +135,14 @@ void flipImageData(unsigned char* data, int width, int height, int comps) | |||
135 | { | 135 | { |
136 | unsigned char* data_copy = (unsigned char*) malloc(width*height*comps*sizeof(unsigned char)); | 136 | unsigned char* data_copy = (unsigned char*) malloc(width*height*comps*sizeof(unsigned char)); |
137 | memcpy(data_copy, data, width*height*comps); | 137 | memcpy(data_copy, data, width*height*comps); |
138 | 138 | ||
139 | int row_size = width * comps; | 139 | int row_size = width * comps; |
140 | 140 | ||
141 | for (int i=0;i<height;i++) | 141 | for (int i=0;i<height;i++) |
142 | { | 142 | { |
143 | memcpy(data + (row_size*i), data_copy + (row_size*(height-i-1)), row_size); | 143 | memcpy(data + (row_size*i), data_copy + (row_size*(height-i-1)), row_size); |
144 | } | 144 | } |
145 | 145 | ||
146 | free(data_copy); | 146 | free(data_copy); |
147 | } | 147 | } |
148 | 148 | ||
@@ -154,11 +154,11 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v | |||
154 | fprintf(stderr, "Could not open mesh file %s\n", filename); | 154 | fprintf(stderr, "Could not open mesh file %s\n", filename); |
155 | exit(1); | 155 | exit(1); |
156 | } | 156 | } |
157 | 157 | ||
158 | std::vector<glm::vec3> temp_vertices; | 158 | std::vector<glm::vec3> temp_vertices; |
159 | std::vector<glm::vec2> temp_uvs; | 159 | std::vector<glm::vec2> temp_uvs; |
160 | std::vector<glm::vec3> temp_normals; | 160 | std::vector<glm::vec3> temp_normals; |
161 | 161 | ||
162 | for (;;) | 162 | for (;;) |
163 | { | 163 | { |
164 | char lineHeader[256]; | 164 | char lineHeader[256]; |
@@ -167,7 +167,7 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v | |||
167 | { | 167 | { |
168 | break; | 168 | break; |
169 | } | 169 | } |
170 | 170 | ||
171 | if (!strncmp(lineHeader, "v", 2)) | 171 | if (!strncmp(lineHeader, "v", 2)) |
172 | { | 172 | { |
173 | glm::vec3 vertex; | 173 | glm::vec3 vertex; |
@@ -187,7 +187,7 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v | |||
187 | { | 187 | { |
188 | int vertexIDs[3], uvIDs[3], normalIDs[3]; | 188 | int vertexIDs[3], uvIDs[3], normalIDs[3]; |
189 | fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIDs[0], &uvIDs[0], &normalIDs[0], &vertexIDs[1], &uvIDs[1], &normalIDs[1], &vertexIDs[2], &uvIDs[2], &normalIDs[2]); | 189 | fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIDs[0], &uvIDs[0], &normalIDs[0], &vertexIDs[1], &uvIDs[1], &normalIDs[1], &vertexIDs[2], &uvIDs[2], &normalIDs[2]); |
190 | 190 | ||
191 | for (int i=0; i<3; i++) | 191 | for (int i=0; i<3; i++) |
192 | { | 192 | { |
193 | out_vertices.push_back(temp_vertices[vertexIDs[i] - 1]); | 193 | out_vertices.push_back(temp_vertices[vertexIDs[i] - 1]); |
@@ -202,24 +202,24 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) | |||
202 | { | 202 | { |
203 | buffer_width = width; | 203 | buffer_width = width; |
204 | buffer_height = height; | 204 | buffer_height = height; |
205 | 205 | ||
206 | glDeleteFramebuffers(1, &bloom_framebuffer); | 206 | glDeleteFramebuffers(1, &bloom_framebuffer); |
207 | glDeleteRenderbuffers(1, &bloom_depthbuffer); | 207 | glDeleteRenderbuffers(1, &bloom_depthbuffer); |
208 | 208 | ||
209 | glGenFramebuffers(1, &bloom_framebuffer); | 209 | glGenFramebuffers(1, &bloom_framebuffer); |
210 | glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); | 210 | glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); |
211 | GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT1}; | 211 | GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT1}; |
212 | glDrawBuffers(1, DrawBuffers); | 212 | glDrawBuffers(1, DrawBuffers); |
213 | 213 | ||
214 | glGenRenderbuffers(1, &bloom_depthbuffer); | 214 | glGenRenderbuffers(1, &bloom_depthbuffer); |
215 | glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); | 215 | glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); |
216 | glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); | 216 | glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); |
217 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); | 217 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); |
218 | 218 | ||
219 | glDeleteTextures(1, &preBloomTex); | 219 | glDeleteTextures(1, &preBloomTex); |
220 | glDeleteTextures(1, &bloomPassTex1); | 220 | glDeleteTextures(1, &bloomPassTex1); |
221 | glDeleteTextures(1, &bloomPassTex2); | 221 | glDeleteTextures(1, &bloomPassTex2); |
222 | 222 | ||
223 | glGenTextures(1, &preBloomTex); | 223 | glGenTextures(1, &preBloomTex); |
224 | glBindTexture(GL_TEXTURE_2D, preBloomTex); | 224 | glBindTexture(GL_TEXTURE_2D, preBloomTex); |
225 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | 225 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); |
@@ -227,7 +227,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) | |||
227 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 227 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
228 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 228 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
229 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 229 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
230 | 230 | ||
231 | glGenTextures(1, &bloomPassTex1); | 231 | glGenTextures(1, &bloomPassTex1); |
232 | glBindTexture(GL_TEXTURE_2D, bloomPassTex1); | 232 | glBindTexture(GL_TEXTURE_2D, bloomPassTex1); |
233 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | 233 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); |
@@ -235,7 +235,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) | |||
235 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 235 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
236 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 236 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
237 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 237 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
238 | 238 | ||
239 | glGenTextures(1, &bloomPassTex2); | 239 | glGenTextures(1, &bloomPassTex2); |
240 | glBindTexture(GL_TEXTURE_2D, bloomPassTex2); | 240 | glBindTexture(GL_TEXTURE_2D, bloomPassTex2); |
241 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | 241 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); |
@@ -252,20 +252,20 @@ GLFWwindow* initRenderer() | |||
252 | fprintf(stderr, "Renderer already initialized\n"); | 252 | fprintf(stderr, "Renderer already initialized\n"); |
253 | exit(-1); | 253 | exit(-1); |
254 | } | 254 | } |
255 | 255 | ||
256 | // Initialize GLFW | 256 | // Initialize GLFW |
257 | if (!glfwInit()) | 257 | if (!glfwInit()) |
258 | { | 258 | { |
259 | fprintf(stderr, "Failed to initialize GLFW\n"); | 259 | fprintf(stderr, "Failed to initialize GLFW\n"); |
260 | exit(-1); | 260 | exit(-1); |
261 | } | 261 | } |
262 | 262 | ||
263 | glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing | 263 | glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing |
264 | glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want version 3.3 | 264 | glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want version 3.3 |
265 | glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | 265 | glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); |
266 | glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Mac requires this | 266 | glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Mac requires this |
267 | glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | 267 | glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); |
268 | 268 | ||
269 | // Create a window | 269 | // Create a window |
270 | window = glfwCreateWindow(1024, 768, "Aromatherapy", nullptr, nullptr); | 270 | window = glfwCreateWindow(1024, 768, "Aromatherapy", nullptr, nullptr); |
271 | if (window == nullptr) | 271 | if (window == nullptr) |
@@ -274,7 +274,7 @@ GLFWwindow* initRenderer() | |||
274 | glfwTerminate(); | 274 | glfwTerminate(); |
275 | exit(-1); | 275 | exit(-1); |
276 | } | 276 | } |
277 | 277 | ||
278 | glfwMakeContextCurrent(window); | 278 | glfwMakeContextCurrent(window); |
279 | glewExperimental = true; // Needed in core profile | 279 | glewExperimental = true; // Needed in core profile |
280 | if (glewInit() != GLEW_OK) | 280 | if (glewInit() != GLEW_OK) |
@@ -282,37 +282,37 @@ GLFWwindow* initRenderer() | |||
282 | fprintf(stderr, "Failed to initialize GLEW\n"); | 282 | fprintf(stderr, "Failed to initialize GLEW\n"); |
283 | exit(-1); | 283 | exit(-1); |
284 | } | 284 | } |
285 | 285 | ||
286 | glfwSetFramebufferSizeCallback(window, &setFramebufferSize); | 286 | glfwSetFramebufferSizeCallback(window, &setFramebufferSize); |
287 | 287 | ||
288 | // Set up vertex array object | 288 | // Set up vertex array object |
289 | glGenVertexArrays(1, &VertexArrayID); | 289 | glGenVertexArrays(1, &VertexArrayID); |
290 | glBindVertexArray(VertexArrayID); | 290 | glBindVertexArray(VertexArrayID); |
291 | 291 | ||
292 | // Enable depth testing | 292 | // Enable depth testing |
293 | glEnable(GL_DEPTH_TEST); | 293 | glEnable(GL_DEPTH_TEST); |
294 | glDepthFunc(GL_LESS); | 294 | glDepthFunc(GL_LESS); |
295 | 295 | ||
296 | // Enable blending | 296 | // Enable blending |
297 | glEnable(GL_BLEND); | 297 | glEnable(GL_BLEND); |
298 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 298 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
299 | 299 | ||
300 | // Set up the framebuffer | 300 | // Set up the framebuffer |
301 | glGenFramebuffers(1, &generic_framebuffer); | 301 | glGenFramebuffers(1, &generic_framebuffer); |
302 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); | 302 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); |
303 | GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; | 303 | GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; |
304 | glDrawBuffers(1, DrawBuffers); | 304 | glDrawBuffers(1, DrawBuffers); |
305 | 305 | ||
306 | glGenFramebuffers(1, &bloom_framebuffer); | 306 | glGenFramebuffers(1, &bloom_framebuffer); |
307 | glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); | 307 | glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); |
308 | GLenum DrawBuffers2[1] = {GL_COLOR_ATTACHMENT1}; | 308 | GLenum DrawBuffers2[1] = {GL_COLOR_ATTACHMENT1}; |
309 | glDrawBuffers(1, DrawBuffers2); | 309 | glDrawBuffers(1, DrawBuffers2); |
310 | 310 | ||
311 | glGenRenderbuffers(1, &bloom_depthbuffer); | 311 | glGenRenderbuffers(1, &bloom_depthbuffer); |
312 | glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); | 312 | glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); |
313 | glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768); | 313 | glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768); |
314 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); | 314 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); |
315 | 315 | ||
316 | // Set up the NTSC rendering buffers | 316 | // Set up the NTSC rendering buffers |
317 | glGenTextures(1, &renderedTex1); | 317 | glGenTextures(1, &renderedTex1); |
318 | glBindTexture(GL_TEXTURE_2D, renderedTex1); | 318 | glBindTexture(GL_TEXTURE_2D, renderedTex1); |
@@ -322,7 +322,7 @@ GLFWwindow* initRenderer() | |||
322 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 322 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
323 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 323 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
324 | renderedTexBufs[0] = renderedTex1; | 324 | renderedTexBufs[0] = renderedTex1; |
325 | 325 | ||
326 | glGenTextures(1, &renderedTex2); | 326 | glGenTextures(1, &renderedTex2); |
327 | glBindTexture(GL_TEXTURE_2D, renderedTex2); | 327 | glBindTexture(GL_TEXTURE_2D, renderedTex2); |
328 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, GAME_WIDTH, GAME_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | 328 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, GAME_WIDTH, GAME_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); |
@@ -331,7 +331,7 @@ GLFWwindow* initRenderer() | |||
331 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 331 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
332 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 332 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
333 | renderedTexBufs[1] = renderedTex2; | 333 | renderedTexBufs[1] = renderedTex2; |
334 | 334 | ||
335 | // Set up bloom rendering buffers | 335 | // Set up bloom rendering buffers |
336 | glGenTextures(1, &preBloomTex); | 336 | glGenTextures(1, &preBloomTex); |
337 | glBindTexture(GL_TEXTURE_2D, preBloomTex); | 337 | glBindTexture(GL_TEXTURE_2D, preBloomTex); |
@@ -340,7 +340,7 @@ GLFWwindow* initRenderer() | |||
340 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 340 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
341 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 341 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
342 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 342 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
343 | 343 | ||
344 | glGenTextures(1, &bloomPassTex1); | 344 | glGenTextures(1, &bloomPassTex1); |
345 | glBindTexture(GL_TEXTURE_2D, bloomPassTex1); | 345 | glBindTexture(GL_TEXTURE_2D, bloomPassTex1); |
346 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | 346 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); |
@@ -348,7 +348,7 @@ GLFWwindow* initRenderer() | |||
348 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 348 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
349 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 349 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
350 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 350 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
351 | 351 | ||
352 | glGenTextures(1, &bloomPassTex2); | 352 | glGenTextures(1, &bloomPassTex2); |
353 | glBindTexture(GL_TEXTURE_2D, bloomPassTex2); | 353 | glBindTexture(GL_TEXTURE_2D, bloomPassTex2); |
354 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | 354 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); |
@@ -356,31 +356,31 @@ GLFWwindow* initRenderer() | |||
356 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 356 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
357 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 357 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
358 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 358 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
359 | 359 | ||
360 | curBuf = 0; | 360 | curBuf = 0; |
361 | 361 | ||
362 | // Load the mesh! | 362 | // Load the mesh! |
363 | std::vector<glm::vec3> mesh_vertices; | 363 | std::vector<glm::vec3> mesh_vertices; |
364 | std::vector<glm::vec2> mesh_uvs; | 364 | std::vector<glm::vec2> mesh_uvs; |
365 | std::vector<glm::vec3> mesh_normals; | 365 | std::vector<glm::vec3> mesh_normals; |
366 | loadMesh("res/monitor-fef.obj", mesh_vertices, mesh_uvs, mesh_normals); | 366 | loadMesh("res/monitor-fef.obj", mesh_vertices, mesh_uvs, mesh_normals); |
367 | 367 | ||
368 | mesh_numvertices = mesh_vertices.size(); | 368 | mesh_numvertices = mesh_vertices.size(); |
369 | 369 | ||
370 | glGenBuffers(1, &mesh_vertexbuffer); | 370 | glGenBuffers(1, &mesh_vertexbuffer); |
371 | glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); | 371 | glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); |
372 | glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW); | 372 | glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW); |
373 | 373 | ||
374 | glGenBuffers(1, &mesh_uvbuffer); | 374 | glGenBuffers(1, &mesh_uvbuffer); |
375 | glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); | 375 | glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); |
376 | glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW); | 376 | glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW); |
377 | 377 | ||
378 | glGenBuffers(1, &mesh_normalbuffer); | 378 | glGenBuffers(1, &mesh_normalbuffer); |
379 | glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); | 379 | glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); |
380 | glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW); | 380 | glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW); |
381 | 381 | ||
382 | // Load the vertices of a flat surface | 382 | // Load the vertices of a flat surface |
383 | GLfloat g_quad_vertex_buffer_data[] = { | 383 | GLfloat g_quad_vertex_buffer_data[] = { |
384 | -1.0f, -1.0f, 0.0f, | 384 | -1.0f, -1.0f, 0.0f, |
385 | 1.0f, -1.0f, 0.0f, | 385 | 1.0f, -1.0f, 0.0f, |
386 | -1.0f, 1.0f, 0.0f, | 386 | -1.0f, 1.0f, 0.0f, |
@@ -392,7 +392,7 @@ GLFWwindow* initRenderer() | |||
392 | glGenBuffers(1, &quad_vertexbuffer); | 392 | glGenBuffers(1, &quad_vertexbuffer); |
393 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 393 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
394 | glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); | 394 | glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); |
395 | 395 | ||
396 | glGenTextures(1, &artifactsTex); | 396 | glGenTextures(1, &artifactsTex); |
397 | glBindTexture(GL_TEXTURE_2D, artifactsTex); | 397 | glBindTexture(GL_TEXTURE_2D, artifactsTex); |
398 | int atdw, atdh; | 398 | int atdw, atdh; |
@@ -403,7 +403,7 @@ GLFWwindow* initRenderer() | |||
403 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 403 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
404 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); | 404 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); |
405 | glGenerateMipmap(GL_TEXTURE_2D); | 405 | glGenerateMipmap(GL_TEXTURE_2D); |
406 | 406 | ||
407 | glGenTextures(1, &scanlinesTex); | 407 | glGenTextures(1, &scanlinesTex); |
408 | glBindTexture(GL_TEXTURE_2D, scanlinesTex); | 408 | glBindTexture(GL_TEXTURE_2D, scanlinesTex); |
409 | int stdw, stdh; | 409 | int stdw, stdh; |
@@ -414,7 +414,7 @@ GLFWwindow* initRenderer() | |||
414 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 414 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
415 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); | 415 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); |
416 | glGenerateMipmap(GL_TEXTURE_2D); | 416 | glGenerateMipmap(GL_TEXTURE_2D); |
417 | 417 | ||
418 | // Load the shaders | 418 | // Load the shaders |
419 | ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment"); | 419 | ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment"); |
420 | finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment"); | 420 | finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment"); |
@@ -422,9 +422,9 @@ GLFWwindow* initRenderer() | |||
422 | fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment"); | 422 | fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment"); |
423 | bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment"); | 423 | bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment"); |
424 | bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment"); | 424 | bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment"); |
425 | 425 | ||
426 | rendererInitialized = true; | 426 | rendererInitialized = true; |
427 | 427 | ||
428 | return window; | 428 | return window; |
429 | } | 429 | } |
430 | 430 | ||
@@ -435,13 +435,13 @@ void destroyRenderer() | |||
435 | fprintf(stderr, "Renderer not initialized\n"); | 435 | fprintf(stderr, "Renderer not initialized\n"); |
436 | exit(-1); | 436 | exit(-1); |
437 | } | 437 | } |
438 | 438 | ||
439 | // Delete the plane buffer | 439 | // Delete the plane buffer |
440 | glDeleteBuffers(1, &quad_vertexbuffer); | 440 | glDeleteBuffers(1, &quad_vertexbuffer); |
441 | glDeleteBuffers(1, &mesh_vertexbuffer); | 441 | glDeleteBuffers(1, &mesh_vertexbuffer); |
442 | glDeleteBuffers(1, &mesh_uvbuffer); | 442 | glDeleteBuffers(1, &mesh_uvbuffer); |
443 | glDeleteBuffers(1, &mesh_normalbuffer); | 443 | glDeleteBuffers(1, &mesh_normalbuffer); |
444 | 444 | ||
445 | // Delete the shaders | 445 | // Delete the shaders |
446 | glDeleteProgram(ntscShader); | 446 | glDeleteProgram(ntscShader); |
447 | glDeleteProgram(finalShader); | 447 | glDeleteProgram(finalShader); |
@@ -449,7 +449,7 @@ void destroyRenderer() | |||
449 | glDeleteProgram(fillShader); | 449 | glDeleteProgram(fillShader); |
450 | glDeleteProgram(bloom1Shader); | 450 | glDeleteProgram(bloom1Shader); |
451 | glDeleteProgram(bloom2Shader); | 451 | glDeleteProgram(bloom2Shader); |
452 | 452 | ||
453 | // Delete the NTSC rendering buffers | 453 | // Delete the NTSC rendering buffers |
454 | glDeleteTextures(1, &renderedTex1); | 454 | glDeleteTextures(1, &renderedTex1); |
455 | glDeleteTextures(1, &renderedTex2); | 455 | glDeleteTextures(1, &renderedTex2); |
@@ -458,18 +458,18 @@ void destroyRenderer() | |||
458 | glDeleteTextures(1, &preBloomTex); | 458 | glDeleteTextures(1, &preBloomTex); |
459 | glDeleteTextures(1, &bloomPassTex1); | 459 | glDeleteTextures(1, &bloomPassTex1); |
460 | glDeleteTextures(1, &bloomPassTex2); | 460 | glDeleteTextures(1, &bloomPassTex2); |
461 | 461 | ||
462 | // Delete the framebuffer | 462 | // Delete the framebuffer |
463 | glDeleteRenderbuffers(1, &bloom_depthbuffer); | 463 | glDeleteRenderbuffers(1, &bloom_depthbuffer); |
464 | glDeleteFramebuffers(1, &bloom_framebuffer); | 464 | glDeleteFramebuffers(1, &bloom_framebuffer); |
465 | glDeleteFramebuffers(1, &generic_framebuffer); | 465 | glDeleteFramebuffers(1, &generic_framebuffer); |
466 | 466 | ||
467 | // Delete the VAO | 467 | // Delete the VAO |
468 | glDeleteVertexArrays(1, &VertexArrayID); | 468 | glDeleteVertexArrays(1, &VertexArrayID); |
469 | 469 | ||
470 | // Kill the window | 470 | // Kill the window |
471 | glfwTerminate(); | 471 | glfwTerminate(); |
472 | 472 | ||
473 | rendererInitialized = false; | 473 | rendererInitialized = false; |
474 | } | 474 | } |
475 | 475 | ||
@@ -480,10 +480,10 @@ Texture::Texture(int width, int height) | |||
480 | fprintf(stderr, "Renderer not initialized\n"); | 480 | fprintf(stderr, "Renderer not initialized\n"); |
481 | exit(-1); | 481 | exit(-1); |
482 | } | 482 | } |
483 | 483 | ||
484 | this->width = width; | 484 | this->width = width; |
485 | this->height = height; | 485 | this->height = height; |
486 | 486 | ||
487 | glGenTextures(1, &texID); | 487 | glGenTextures(1, &texID); |
488 | glBindTexture(GL_TEXTURE_2D, texID); | 488 | glBindTexture(GL_TEXTURE_2D, texID); |
489 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); | 489 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); |
@@ -500,7 +500,7 @@ Texture::Texture(const char* filename) | |||
500 | fprintf(stderr, "Renderer not initialized\n"); | 500 | fprintf(stderr, "Renderer not initialized\n"); |
501 | exit(-1); | 501 | exit(-1); |
502 | } | 502 | } |
503 | 503 | ||
504 | glGenTextures(1, &texID); | 504 | glGenTextures(1, &texID); |
505 | glBindTexture(GL_TEXTURE_2D, texID); | 505 | glBindTexture(GL_TEXTURE_2D, texID); |
506 | unsigned char* data = stbi_load(filename, &width, &height, 0, 4); | 506 | unsigned char* data = stbi_load(filename, &width, &height, 0, 4); |
@@ -520,14 +520,14 @@ Texture::Texture(const Texture& tex) | |||
520 | fprintf(stderr, "Renderer not initialized\n"); | 520 | fprintf(stderr, "Renderer not initialized\n"); |
521 | exit(-1); | 521 | exit(-1); |
522 | } | 522 | } |
523 | 523 | ||
524 | width = tex.width; | 524 | width = tex.width; |
525 | height = tex.height; | 525 | height = tex.height; |
526 | 526 | ||
527 | unsigned char* data = (unsigned char*) malloc(4 * width * height); | 527 | unsigned char* data = (unsigned char*) malloc(4 * width * height); |
528 | glBindTexture(GL_TEXTURE_2D, tex.texID); | 528 | glBindTexture(GL_TEXTURE_2D, tex.texID); |
529 | glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); | 529 | glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); |
530 | 530 | ||
531 | glGenTextures(1, &texID); | 531 | glGenTextures(1, &texID); |
532 | glBindTexture(GL_TEXTURE_2D, texID); | 532 | glBindTexture(GL_TEXTURE_2D, texID); |
533 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); | 533 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); |
@@ -535,7 +535,7 @@ Texture::Texture(const Texture& tex) | |||
535 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 535 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
536 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 536 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
537 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 537 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
538 | 538 | ||
539 | free(data); | 539 | free(data); |
540 | } | 540 | } |
541 | 541 | ||
@@ -551,14 +551,14 @@ Texture::~Texture() | |||
551 | fprintf(stderr, "Renderer not initialized\n"); | 551 | fprintf(stderr, "Renderer not initialized\n"); |
552 | exit(-1); | 552 | exit(-1); |
553 | } | 553 | } |
554 | 554 | ||
555 | glDeleteTextures(1, &texID); | 555 | glDeleteTextures(1, &texID); |
556 | } | 556 | } |
557 | 557 | ||
558 | Texture& Texture::operator= (Texture tex) | 558 | Texture& Texture::operator= (Texture tex) |
559 | { | 559 | { |
560 | swap(*this, tex); | 560 | swap(*this, tex); |
561 | 561 | ||
562 | return *this; | 562 | return *this; |
563 | } | 563 | } |
564 | 564 | ||
@@ -576,17 +576,17 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b) | |||
576 | fprintf(stderr, "Renderer not initialized\n"); | 576 | fprintf(stderr, "Renderer not initialized\n"); |
577 | exit(-1); | 577 | exit(-1); |
578 | } | 578 | } |
579 | 579 | ||
580 | // Target the framebuffer | 580 | // Target the framebuffer |
581 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); | 581 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); |
582 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); | 582 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); |
583 | 583 | ||
584 | // Set up the vertex attributes | 584 | // Set up the vertex attributes |
585 | GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; | 585 | GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; |
586 | GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); | 586 | GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); |
587 | GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; | 587 | GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; |
588 | GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); | 588 | GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); |
589 | 589 | ||
590 | GLfloat vertexbuffer_data[] = { | 590 | GLfloat vertexbuffer_data[] = { |
591 | minx, miny, | 591 | minx, miny, |
592 | maxx, miny, | 592 | maxx, miny, |
@@ -601,14 +601,14 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b) | |||
601 | glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); | 601 | glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); |
602 | glEnableVertexAttribArray(0); | 602 | glEnableVertexAttribArray(0); |
603 | glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); | 603 | glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); |
604 | 604 | ||
605 | glViewport(0, 0, width, height); | 605 | glViewport(0, 0, width, height); |
606 | glClear(GL_DEPTH_BUFFER_BIT); | 606 | glClear(GL_DEPTH_BUFFER_BIT); |
607 | glUseProgram(fillShader); | 607 | glUseProgram(fillShader); |
608 | glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0); | 608 | glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0); |
609 | 609 | ||
610 | glDrawArrays(GL_TRIANGLES, 0, 6); | 610 | glDrawArrays(GL_TRIANGLES, 0, 6); |
611 | 611 | ||
612 | glDisableVertexAttribArray(0); | 612 | glDisableVertexAttribArray(0); |
613 | glDeleteBuffers(1, &vertexbuffer); | 613 | glDeleteBuffers(1, &vertexbuffer); |
614 | } | 614 | } |
@@ -620,19 +620,19 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, | |||
620 | fprintf(stderr, "Renderer not initialized\n"); | 620 | fprintf(stderr, "Renderer not initialized\n"); |
621 | exit(-1); | 621 | exit(-1); |
622 | } | 622 | } |
623 | 623 | ||
624 | alpha = glm::clamp(alpha, 0.0, 1.0); | 624 | alpha = glm::clamp(alpha, 0.0, 1.0); |
625 | 625 | ||
626 | // Target the framebuffer | 626 | // Target the framebuffer |
627 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); | 627 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); |
628 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); | 628 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); |
629 | 629 | ||
630 | // Set up the vertex attributes | 630 | // Set up the vertex attributes |
631 | GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; | 631 | GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; |
632 | GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); | 632 | GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); |
633 | GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; | 633 | GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; |
634 | GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); | 634 | GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); |
635 | 635 | ||
636 | GLfloat vertexbuffer_data[] = { | 636 | GLfloat vertexbuffer_data[] = { |
637 | minx, miny, | 637 | minx, miny, |
638 | maxx, miny, | 638 | maxx, miny, |
@@ -645,12 +645,12 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, | |||
645 | glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); | 645 | glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); |
646 | glEnableVertexAttribArray(0); | 646 | glEnableVertexAttribArray(0); |
647 | glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); | 647 | glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); |
648 | 648 | ||
649 | GLfloat minu = (GLfloat) srcrect.x / srctex.width; | 649 | GLfloat minu = (GLfloat) srcrect.x / srctex.width; |
650 | GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height); | 650 | GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height); |
651 | GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width; | 651 | GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width; |
652 | GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height); | 652 | GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height); |
653 | 653 | ||
654 | GLfloat texcoordbuffer_data[] = { | 654 | GLfloat texcoordbuffer_data[] = { |
655 | minu, minv, | 655 | minu, minv, |
656 | maxu, minv, | 656 | maxu, minv, |
@@ -663,20 +663,20 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, | |||
663 | glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW); | 663 | glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW); |
664 | glEnableVertexAttribArray(1); | 664 | glEnableVertexAttribArray(1); |
665 | glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); | 665 | glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); |
666 | 666 | ||
667 | // Set up the shader | 667 | // Set up the shader |
668 | glUseProgram(blitShader); | 668 | glUseProgram(blitShader); |
669 | glClear(GL_DEPTH_BUFFER_BIT); | 669 | glClear(GL_DEPTH_BUFFER_BIT); |
670 | glViewport(0, 0, width, height); | 670 | glViewport(0, 0, width, height); |
671 | 671 | ||
672 | glActiveTexture(GL_TEXTURE0); | 672 | glActiveTexture(GL_TEXTURE0); |
673 | glBindTexture(GL_TEXTURE_2D, srctex.texID); | 673 | glBindTexture(GL_TEXTURE_2D, srctex.texID); |
674 | glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0); | 674 | glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0); |
675 | glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha); | 675 | glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha); |
676 | 676 | ||
677 | // Blit! | 677 | // Blit! |
678 | glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | 678 | glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
679 | 679 | ||
680 | // Unload everything | 680 | // Unload everything |
681 | glDisableVertexAttribArray(1); | 681 | glDisableVertexAttribArray(1); |
682 | glDisableVertexAttribArray(0); | 682 | glDisableVertexAttribArray(0); |
@@ -691,11 +691,11 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes, | |||
691 | glViewport(0,0,dstRes.x,dstRes.y); | 691 | glViewport(0,0,dstRes.x,dstRes.y); |
692 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 692 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
693 | glUseProgram(bloom1Shader); | 693 | glUseProgram(bloom1Shader); |
694 | 694 | ||
695 | glActiveTexture(GL_TEXTURE0); | 695 | glActiveTexture(GL_TEXTURE0); |
696 | glBindTexture(GL_TEXTURE_2D, srcTex); | 696 | glBindTexture(GL_TEXTURE_2D, srcTex); |
697 | glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0); | 697 | glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0); |
698 | 698 | ||
699 | glm::vec2 offset = glm::vec2(0.0); | 699 | glm::vec2 offset = glm::vec2(0.0); |
700 | if (horizontal) | 700 | if (horizontal) |
701 | { | 701 | { |
@@ -703,9 +703,9 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes, | |||
703 | } else { | 703 | } else { |
704 | offset.y = 1.2/srcRes.y; | 704 | offset.y = 1.2/srcRes.y; |
705 | } | 705 | } |
706 | 706 | ||
707 | glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y); | 707 | glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y); |
708 | 708 | ||
709 | glEnableVertexAttribArray(0); | 709 | glEnableVertexAttribArray(0); |
710 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 710 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
711 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); | 711 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); |
@@ -720,17 +720,17 @@ void Texture::renderScreen() const | |||
720 | fprintf(stderr, "Renderer not initialized\n"); | 720 | fprintf(stderr, "Renderer not initialized\n"); |
721 | exit(-1); | 721 | exit(-1); |
722 | } | 722 | } |
723 | 723 | ||
724 | // First we're going to composite our frame with the previous frame | 724 | // First we're going to composite our frame with the previous frame |
725 | // We start by setting up the framebuffer | 725 | // We start by setting up the framebuffer |
726 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); | 726 | glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); |
727 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); | 727 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); |
728 | 728 | ||
729 | // Set up the shader | 729 | // Set up the shader |
730 | glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); | 730 | glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); |
731 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 731 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
732 | glUseProgram(ntscShader); | 732 | glUseProgram(ntscShader); |
733 | 733 | ||
734 | // Use the current frame texture, nearest neighbor and clamped to edge | 734 | // Use the current frame texture, nearest neighbor and clamped to edge |
735 | glActiveTexture(GL_TEXTURE0); | 735 | glActiveTexture(GL_TEXTURE0); |
736 | glBindTexture(GL_TEXTURE_2D, texID); | 736 | glBindTexture(GL_TEXTURE_2D, texID); |
@@ -739,7 +739,7 @@ void Texture::renderScreen() const | |||
739 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 739 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
740 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 740 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
741 | glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); | 741 | glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); |
742 | 742 | ||
743 | // Use the previous frame composite texture, nearest neighbor and clamped to edge | 743 | // Use the previous frame composite texture, nearest neighbor and clamped to edge |
744 | glActiveTexture(GL_TEXTURE1); | 744 | glActiveTexture(GL_TEXTURE1); |
745 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); | 745 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); |
@@ -748,13 +748,13 @@ void Texture::renderScreen() const | |||
748 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 748 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
749 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 749 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
750 | glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); | 750 | glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); |
751 | 751 | ||
752 | // Load the NTSC artifact texture | 752 | // Load the NTSC artifact texture |
753 | glActiveTexture(GL_TEXTURE2); | 753 | glActiveTexture(GL_TEXTURE2); |
754 | glBindTexture(GL_TEXTURE_2D, artifactsTex); | 754 | glBindTexture(GL_TEXTURE_2D, artifactsTex); |
755 | glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); | 755 | glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); |
756 | glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); | 756 | glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); |
757 | 757 | ||
758 | if ((rand() % 60) == 0) | 758 | if ((rand() % 60) == 0) |
759 | { | 759 | { |
760 | // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect! | 760 | // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect! |
@@ -762,7 +762,7 @@ void Texture::renderScreen() const | |||
762 | } else { | 762 | } else { |
763 | glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0); | 763 | glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0); |
764 | } | 764 | } |
765 | 765 | ||
766 | // Render our composition | 766 | // Render our composition |
767 | glEnableVertexAttribArray(0); | 767 | glEnableVertexAttribArray(0); |
768 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 768 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
@@ -776,7 +776,7 @@ void Texture::renderScreen() const | |||
776 | glViewport(0,0,buffer_width,buffer_height); | 776 | glViewport(0,0,buffer_width,buffer_height); |
777 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 777 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
778 | glUseProgram(finalShader); | 778 | glUseProgram(finalShader); |
779 | 779 | ||
780 | // Use the composited frame texture, linearly filtered and filling in black for the border | 780 | // Use the composited frame texture, linearly filtered and filling in black for the border |
781 | glActiveTexture(GL_TEXTURE0); | 781 | glActiveTexture(GL_TEXTURE0); |
782 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); | 782 | glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); |
@@ -788,69 +788,69 @@ void Texture::renderScreen() const | |||
788 | glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); | 788 | glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); |
789 | glGenerateMipmap(GL_TEXTURE_2D); | 789 | glGenerateMipmap(GL_TEXTURE_2D); |
790 | glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); | 790 | glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); |
791 | 791 | ||
792 | // Use the scanlines texture | 792 | // Use the scanlines texture |
793 | glActiveTexture(GL_TEXTURE1); | 793 | glActiveTexture(GL_TEXTURE1); |
794 | glBindTexture(GL_TEXTURE_2D, scanlinesTex); | 794 | glBindTexture(GL_TEXTURE_2D, scanlinesTex); |
795 | glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); | 795 | glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); |
796 | 796 | ||
797 | // Initialize the MVP matrices | 797 | // Initialize the MVP matrices |
798 | glm::mat4 p_matrix = glm::perspective(42.5f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); | 798 | glm::mat4 p_matrix = glm::perspective(42.5f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); |
799 | glm::mat4 v_matrix = glm::lookAt(glm::vec3(2,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0)); | 799 | glm::mat4 v_matrix = glm::lookAt(glm::vec3(2,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0)); |
800 | glm::mat4 m_matrix = glm::mat4(1.0); | 800 | glm::mat4 m_matrix = glm::mat4(1.0); |
801 | glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; | 801 | glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; |
802 | 802 | ||
803 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); | 803 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); |
804 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); | 804 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); |
805 | glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); | 805 | glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); |
806 | glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime()); | 806 | glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime()); |
807 | 807 | ||
808 | glEnableVertexAttribArray(0); | 808 | glEnableVertexAttribArray(0); |
809 | glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); | 809 | glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); |
810 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); | 810 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); |
811 | 811 | ||
812 | glEnableVertexAttribArray(1); | 812 | glEnableVertexAttribArray(1); |
813 | glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); | 813 | glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); |
814 | glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); | 814 | glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); |
815 | 815 | ||
816 | glEnableVertexAttribArray(2); | 816 | glEnableVertexAttribArray(2); |
817 | glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); | 817 | glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); |
818 | glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); | 818 | glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); |
819 | 819 | ||
820 | glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices); | 820 | glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices); |
821 | glDisableVertexAttribArray(2); | 821 | glDisableVertexAttribArray(2); |
822 | glDisableVertexAttribArray(1); | 822 | glDisableVertexAttribArray(1); |
823 | glDisableVertexAttribArray(0); | 823 | glDisableVertexAttribArray(0); |
824 | 824 | ||
825 | // First pass of bloom! | 825 | // First pass of bloom! |
826 | glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height); | 826 | glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height); |
827 | bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f); | 827 | bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f); |
828 | bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f); | 828 | bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f); |
829 | 829 | ||
830 | // Do the second pass of bloom and render to screen | 830 | // Do the second pass of bloom and render to screen |
831 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | 831 | glBindFramebuffer(GL_FRAMEBUFFER, 0); |
832 | glViewport(0, 0, buffer_width, buffer_height); | 832 | glViewport(0, 0, buffer_width, buffer_height); |
833 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 833 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
834 | glUseProgram(bloom2Shader); | 834 | glUseProgram(bloom2Shader); |
835 | 835 | ||
836 | glActiveTexture(GL_TEXTURE0); | 836 | glActiveTexture(GL_TEXTURE0); |
837 | glBindTexture(GL_TEXTURE_2D, preBloomTex); | 837 | glBindTexture(GL_TEXTURE_2D, preBloomTex); |
838 | glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0); | 838 | glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0); |
839 | 839 | ||
840 | glActiveTexture(GL_TEXTURE1); | 840 | glActiveTexture(GL_TEXTURE1); |
841 | glBindTexture(GL_TEXTURE_2D, bloomPassTex2); | 841 | glBindTexture(GL_TEXTURE_2D, bloomPassTex2); |
842 | glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1); | 842 | glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1); |
843 | 843 | ||
844 | glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); | 844 | glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); |
845 | 845 | ||
846 | glEnableVertexAttribArray(0); | 846 | glEnableVertexAttribArray(0); |
847 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 847 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
848 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); | 848 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); |
849 | glDrawArrays(GL_TRIANGLES, 0, 6); | 849 | glDrawArrays(GL_TRIANGLES, 0, 6); |
850 | glDisableVertexAttribArray(0); | 850 | glDisableVertexAttribArray(0); |
851 | 851 | ||
852 | glfwSwapBuffers(window); | 852 | glfwSwapBuffers(window); |
853 | 853 | ||
854 | curBuf = (curBuf + 1) % 2; | 854 | curBuf = (curBuf + 1) % 2; |
855 | } | 855 | } |
856 | 856 | ||