diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2015-02-19 22:54:40 -0500 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2015-02-19 22:54:40 -0500 |
| commit | e3e5a247c58c6e0b45d81ab61314bd8d1bd530ac (patch) | |
| tree | 261c046c1dac2ee0473fae547b9a15b0ee46f0c4 /src | |
| parent | cd48894563052baeddff64f6bbc13ccc7fa6e081 (diff) | |
| download | therapy-e3e5a247c58c6e0b45d81ab61314bd8d1bd530ac.tar.gz therapy-e3e5a247c58c6e0b45d81ab61314bd8d1bd530ac.tar.bz2 therapy-e3e5a247c58c6e0b45d81ab61314bd8d1bd530ac.zip | |
Added ability to resize window (full screen is really laggy though!)
Diffstat (limited to 'src')
| -rw-r--r-- | src/renderer.cpp | 55 |
1 files changed, 50 insertions, 5 deletions
| diff --git a/src/renderer.cpp b/src/renderer.cpp index 00ae7ef..b0421e3 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
| @@ -12,6 +12,8 @@ static GLFWwindow* window; | |||
| 12 | 12 | ||
| 13 | static GLuint FramebufferName; // The framebuffer | 13 | static GLuint FramebufferName; // The framebuffer |
| 14 | static GLuint depthrenderbuffer; | 14 | static GLuint depthrenderbuffer; |
| 15 | static int buffer_width = 1024; | ||
| 16 | static int buffer_height = 768; | ||
| 15 | 17 | ||
| 16 | static GLuint ntscShader; // The NTSC shader | 18 | static GLuint ntscShader; // The NTSC shader |
| 17 | static GLuint finalShader; // The passthrough shader | 19 | static GLuint finalShader; // The passthrough shader |
| @@ -249,6 +251,44 @@ void loadMesh(const char* filename, std::vector<glm::vec3>& out_vertices, std::v | |||
| 249 | } | 251 | } |
| 250 | } | 252 | } |
| 251 | 253 | ||
| 254 | void setFramebufferSize(GLFWwindow* w, int width, int height) | ||
| 255 | { | ||
| 256 | buffer_width = width; | ||
| 257 | buffer_height = height; | ||
| 258 | |||
| 259 | glDeleteFramebuffers(1, &FramebufferName); | ||
| 260 | glDeleteRenderbuffers(1, &depthrenderbuffer); | ||
| 261 | |||
| 262 | glGenFramebuffers(1, &FramebufferName); | ||
| 263 | glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); | ||
| 264 | GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; | ||
| 265 | glDrawBuffers(1, DrawBuffers); | ||
| 266 | |||
| 267 | glGenRenderbuffers(1, &depthrenderbuffer); | ||
| 268 | glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer); | ||
| 269 | glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); | ||
| 270 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer); | ||
| 271 | |||
| 272 | glDeleteTextures(1, &preBloomTex); | ||
| 273 | glDeleteTextures(1, &bloomPassTex); | ||
| 274 | |||
| 275 | glGenTextures(1, &preBloomTex); | ||
| 276 | glBindTexture(GL_TEXTURE_2D, preBloomTex); | ||
| 277 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | ||
| 278 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||
| 279 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||
| 280 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | ||
| 281 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | ||
| 282 | |||
| 283 | glGenTextures(1, &bloomPassTex); | ||
| 284 | glBindTexture(GL_TEXTURE_2D, bloomPassTex); | ||
| 285 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/16, height/16, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); | ||
| 286 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||
| 287 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||
| 288 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | ||
| 289 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | ||
| 290 | } | ||
| 291 | |||
| 252 | GLFWwindow* initRenderer() | 292 | GLFWwindow* initRenderer() |
| 253 | { | 293 | { |
| 254 | if (rendererInitialized) | 294 | if (rendererInitialized) |
| @@ -287,6 +327,8 @@ GLFWwindow* initRenderer() | |||
| 287 | exit(-1); | 327 | exit(-1); |
| 288 | } | 328 | } |
| 289 | 329 | ||
| 330 | glfwSetFramebufferSizeCallback(window, &setFramebufferSize); | ||
| 331 | |||
| 290 | // Set up vertex array object | 332 | // Set up vertex array object |
| 291 | glGenVertexArrays(1, &VertexArrayID); | 333 | glGenVertexArrays(1, &VertexArrayID); |
| 292 | glBindVertexArray(VertexArrayID); | 334 | glBindVertexArray(VertexArrayID); |
| @@ -656,7 +698,7 @@ void renderWithoutEffects(Texture* tex) | |||
| 656 | } | 698 | } |
| 657 | 699 | ||
| 658 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | 700 | glBindFramebuffer(GL_FRAMEBUFFER, 0); |
| 659 | glViewport(0, 0, 1024, 768); | 701 | glViewport(0, 0, buffer_width, buffer_height); |
| 660 | glClear(GL_COLOR_BUFFER_BIT); | 702 | glClear(GL_COLOR_BUFFER_BIT); |
| 661 | glUseProgram(blitShader); | 703 | glUseProgram(blitShader); |
| 662 | 704 | ||
| @@ -755,7 +797,7 @@ void renderScreen(Texture* tex) | |||
| 755 | // We're going to render the screen now | 797 | // We're going to render the screen now |
| 756 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, preBloomTex, 0); | 798 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, preBloomTex, 0); |
| 757 | //glBindFramebuffer(GL_FRAMEBUFFER, 0); | 799 | //glBindFramebuffer(GL_FRAMEBUFFER, 0); |
| 758 | glViewport(0,0,1024,768); | 800 | glViewport(0,0,buffer_width,buffer_height); |
| 759 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 801 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 760 | glUseProgram(finalShader); | 802 | glUseProgram(finalShader); |
| 761 | 803 | ||
| @@ -777,7 +819,7 @@ void renderScreen(Texture* tex) | |||
| 777 | glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); | 819 | glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); |
| 778 | 820 | ||
| 779 | // Initialize the MVP matrices | 821 | // Initialize the MVP matrices |
| 780 | mat4 p_matrix = perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f); | 822 | mat4 p_matrix = perspective(45.0f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); |
| 781 | mat4 v_matrix = lookAt(vec3(2,0,0), vec3(0,0,0), vec3(0,1,0)); | 823 | mat4 v_matrix = lookAt(vec3(2,0,0), vec3(0,0,0), vec3(0,1,0)); |
| 782 | mat4 m_matrix = mat4(1.0); | 824 | mat4 m_matrix = mat4(1.0); |
| 783 | mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; | 825 | mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; |
| @@ -785,6 +827,7 @@ void renderScreen(Texture* tex) | |||
| 785 | 827 | ||
| 786 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); | 828 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); |
| 787 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); | 829 | glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); |
| 830 | glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); | ||
| 788 | 831 | ||
| 789 | glEnableVertexAttribArray(0); | 832 | glEnableVertexAttribArray(0); |
| 790 | glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); | 833 | glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); |
| @@ -805,7 +848,7 @@ void renderScreen(Texture* tex) | |||
| 805 | 848 | ||
| 806 | // Do the first pass of bloom (downsampling and tapping) | 849 | // Do the first pass of bloom (downsampling and tapping) |
| 807 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, bloomPassTex, 0); | 850 | glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, bloomPassTex, 0); |
| 808 | glViewport(0, 0, 64, 48); | 851 | glViewport(0, 0, buffer_width/16, buffer_height/16); |
| 809 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 852 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 810 | glUseProgram(bloom1Shader); | 853 | glUseProgram(bloom1Shader); |
| 811 | 854 | ||
| @@ -814,6 +857,7 @@ void renderScreen(Texture* tex) | |||
| 814 | glUniform1i(glGetUniformLocation(bloom1Shader, "screenTex"), 0); | 857 | glUniform1i(glGetUniformLocation(bloom1Shader, "screenTex"), 0); |
| 815 | 858 | ||
| 816 | glUniform1f(glGetUniformLocation(bloom1Shader, "iGlobalTime"), glfwGetTime()); | 859 | glUniform1f(glGetUniformLocation(bloom1Shader, "iGlobalTime"), glfwGetTime()); |
| 860 | glUniform2f(glGetUniformLocation(bloom1Shader, "resolution"), buffer_width, buffer_height); | ||
| 817 | 861 | ||
| 818 | glEnableVertexAttribArray(0); | 862 | glEnableVertexAttribArray(0); |
| 819 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 863 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
| @@ -823,7 +867,7 @@ void renderScreen(Texture* tex) | |||
| 823 | 867 | ||
| 824 | // Do the second pass of bloom and render to screen | 868 | // Do the second pass of bloom and render to screen |
| 825 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | 869 | glBindFramebuffer(GL_FRAMEBUFFER, 0); |
| 826 | glViewport(0, 0, 1024, 768); | 870 | glViewport(0, 0, buffer_width, buffer_height); |
| 827 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 871 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 828 | glUseProgram(bloom2Shader); | 872 | glUseProgram(bloom2Shader); |
| 829 | 873 | ||
| @@ -836,6 +880,7 @@ void renderScreen(Texture* tex) | |||
| 836 | glUniform1i(glGetUniformLocation(bloom2Shader, "downsampledTex"), 1); | 880 | glUniform1i(glGetUniformLocation(bloom2Shader, "downsampledTex"), 1); |
| 837 | 881 | ||
| 838 | glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); | 882 | glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); |
| 883 | glUniform2f(glGetUniformLocation(bloom2Shader, "resolution"), buffer_width, buffer_height); | ||
| 839 | 884 | ||
| 840 | glEnableVertexAttribArray(0); | 885 | glEnableVertexAttribArray(0); |
| 841 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | 886 | glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); |
