From 783b308990e7c4ef0837a102a138778f73e4d2b7 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sun, 15 Feb 2015 15:23:19 -0500 Subject: Added bloom! --- src/main.cpp | 44 +--------------------------------- src/renderer.cpp | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 45 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index 7c1a21f..e1e1aa2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,26 +5,6 @@ using namespace::std; -#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS__) || defined(__TOS_WIN__) - - #include - - inline void delay( unsigned long ms ) - { - Sleep( ms ); - } - -#else /* presume POSIX */ - - #include - - inline void delay( unsigned long ms ) - { - usleep( ms * 1000 ); - } - -#endif - const int FRAMES_PER_SECOND = 60; bool holding_left = false; bool holding_right = false; @@ -81,21 +61,8 @@ int main() Texture* tiles = loadTextureFromBMP("../res/tiles.bmp"); - double lastTime = glfwGetTime(); - int nbFrames = 0; - while (!quit) { - /* - double currentTime = glfwGetTime(); - nbFrames++; - if ( currentTime - lastTime >= 1.0 ){ // If last prinf() was more than 1 sec ago - // printf and reset timer - printf("%f ms/frame\n", 1000.0/double(nbFrames)); - nbFrames = 0; - lastTime += 1.0; - }*/ - if (holding_left && player->x_vel >= 0) { player->x_vel = -2; @@ -125,20 +92,11 @@ int main() Rectangle dst_rect(player->x, player->y, player->w, player->h); //blitTexture(tiles, buffer, &src_rect, &dst_rect); - fillTexture(buffer, &dst_rect, 85, 85, 255); - //fillTexture(buffer, NULL, 85, 85, 0); + fillTexture(buffer, &dst_rect, 255, 255, 255); renderScreen(buffer); - //fuckThePolice(buffer); - glfwPollEvents(); - - // Regulate frame rate - /*if ((clock() - frame_start) < CLOCKS_PER_SEC / FRAMES_PER_SECOND) - { - //delay(((CLOCKS_PER_SEC / FRAMES_PER_SECOND) - clock() + frame_start) * CLOCKS_PER_SEC / 1000); - }*/ } delete map; diff --git a/src/renderer.cpp b/src/renderer.cpp index ca356f3..3011e8f 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -14,6 +14,8 @@ static GLuint ntscShader; // The NTSC shader static GLuint finalShader; // The passthrough shader static GLuint blitShader; // The blitting shader static GLuint fillShader; // The fill shader +static GLuint bloom1Shader; +static GLuint bloom2Shader; // The buffers for the NTSC rendering process static GLuint renderedTex1; @@ -22,6 +24,8 @@ static GLuint renderedTexBufs[2]; static int curBuf; static GLuint artifactsTex; static GLuint scanlinesTex; +static GLuint preBloomTex; +static GLuint bloomPassTex; GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) { @@ -246,6 +250,23 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); renderedTexBufs[1] = renderedTex2; + // Set up bloom rendering buffers + glGenTextures(1, &preBloomTex); + glBindTexture(GL_TEXTURE_2D, preBloomTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glGenTextures(1, &bloomPassTex); + glBindTexture(GL_TEXTURE_2D, bloomPassTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 64, 48, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + curBuf = 0; artifactsTex = loadBMP_custom("../res/artifacts.bmp"); @@ -256,6 +277,8 @@ GLFWwindow* initRenderer() finalShader = LoadShaders("../shaders/final.vertex", "../shaders/final.fragment"); blitShader = LoadShaders("../shaders/blit.vertex", "../shaders/blit.fragment"); fillShader = LoadShaders("../shaders/fill.vertex", "../shaders/fill.fragment"); + bloom1Shader = LoadShaders("../shaders/bloom1.vertex", "../shaders/bloom1.fragment"); + bloom2Shader = LoadShaders("../shaders/bloom2.vertex", "../shaders/bloom2.fragment"); rendererInitialized = true; @@ -275,12 +298,16 @@ void destroyRenderer() glDeleteProgram(finalShader); glDeleteProgram(blitShader); glDeleteProgram(fillShader); + glDeleteProgram(bloom1Shader); + glDeleteProgram(bloom2Shader); // Delete the NTSC rendering buffers glDeleteTextures(1, &renderedTex1); glDeleteTextures(1, &renderedTex2); glDeleteTextures(1, &artifactsTex); glDeleteTextures(1, &scanlinesTex); + glDeleteTextures(1, &preBloomTex); + glDeleteTextures(1, &bloomPassTex); // Delete the framebuffer glDeleteFramebuffers(1, &FramebufferName); @@ -578,8 +605,9 @@ void renderScreen(Texture* tex) glBindBuffer(GL_ARRAY_BUFFER, g_norms); glBufferData(GL_ARRAY_BUFFER, sizeof(g_norms_data), g_norms_data, GL_STATIC_DRAW); - // We're going to output to the window now - glBindFramebuffer(GL_FRAMEBUFFER, 0); + // We're going to render the screen now + //glBindFramebuffer(GL_FRAMEBUFFER, 0); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, preBloomTex, 0); glViewport(0,0,1024,768); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(finalShader); @@ -606,6 +634,7 @@ void renderScreen(Texture* tex) mat4 v_matrix = lookAt(vec3(0,0,1), vec3(0,0,0), vec3(0,1,0)); mat4 m_matrix = mat4(1.0f); mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; + //mat4 mv_matrix = v_matrix * m_matrix; glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); @@ -622,6 +651,46 @@ void renderScreen(Texture* tex) glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); + // Do the first pass of bloom (downsampling and tapping) + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, bloomPassTex, 0); + glViewport(0, 0, 64, 48); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(bloom1Shader); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, preBloomTex); + glUniform1i(glGetUniformLocation(bloom1Shader, "screenTex"), 0); + + glUniform1f(glGetUniformLocation(bloom1Shader, "iGlobalTime"), glfwGetTime()); + + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + glDrawArrays(GL_TRIANGLES, 0, 6); + glDisableVertexAttribArray(0); + + // Do the second pass of bloom and render to screen + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glViewport(0, 0, 1024, 768); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(bloom2Shader); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, preBloomTex); + glUniform1i(glGetUniformLocation(bloom2Shader, "screenTex"), 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, bloomPassTex); + glUniform1i(glGetUniformLocation(bloom2Shader, "downsampledTex"), 1); + + glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); + + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + glDrawArrays(GL_TRIANGLES, 0, 6); + glDisableVertexAttribArray(0); + glfwSwapBuffers(window); glDeleteBuffers(1, &g_norms); -- cgit 1.4.1