From e3e5a247c58c6e0b45d81ab61314bd8d1bd530ac Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Thu, 19 Feb 2015 22:54:40 -0500 Subject: Added ability to resize window (full screen is really laggy though!) --- shaders/bloom1.fragment | 3 ++- shaders/bloom2.fragment | 3 ++- shaders/final.fragment | 14 +++++-------- src/renderer.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/shaders/bloom1.fragment b/shaders/bloom1.fragment index 4940933..cfb2799 100644 --- a/shaders/bloom1.fragment +++ b/shaders/bloom1.fragment @@ -6,6 +6,7 @@ out vec3 color; uniform sampler2D screenTex; uniform float iGlobalTime; +uniform vec2 resolution; float nrand(vec2 n) { @@ -45,7 +46,7 @@ void main() vec2 ofs = fTaps_Poisson[i]; ofs = vec2(dot(ofs, basis.xz), dot(ofs, basis.yw)); - vec2 texcoord = UV + max_siz * ofs / vec2(1024.0,768.0); + vec2 texcoord = UV + max_siz * ofs / resolution; sum += texture(screenTex, texcoord, -10.0); } diff --git a/shaders/bloom2.fragment b/shaders/bloom2.fragment index aa69f0f..1d9cac4 100644 --- a/shaders/bloom2.fragment +++ b/shaders/bloom2.fragment @@ -7,6 +7,7 @@ out vec3 color; uniform sampler2D screenTex; uniform sampler2D downsampledTex; uniform float iGlobalTime; +uniform vec2 resolution; float nrand(vec2 n) { @@ -46,7 +47,7 @@ void main() vec2 ofs = fTaps_Poisson[i]; ofs = vec2(dot(ofs, basis.xz), dot(ofs, basis.yw)); - vec2 texcoord = UV + max_siz * ofs / vec2(64.0,48.0); + vec2 texcoord = UV + max_siz * ofs / (resolution / vec2(16.0)); sum += texture(downsampledTex, texcoord, -10.0); } diff --git a/shaders/final.fragment b/shaders/final.fragment index 7eeb78e..4a51ad3 100644 --- a/shaders/final.fragment +++ b/shaders/final.fragment @@ -11,10 +11,6 @@ out vec3 color; uniform sampler2D rendertex; uniform sampler2D scanlinestex; -const vec2 UVScalar = vec2(1.0, 1.0); -const vec2 UVOffset = vec2(0.0, 0.0); -const vec2 CRTMask_Scale = vec2(85.0, 153.6)*4.0; -const vec2 CRTMask_Offset = vec2(0.0, 0.0); const float Tuning_Overscan = 1.08; const float Tuning_Dimming = 0.0; const float Tuning_Satur = 1.0; @@ -27,18 +23,18 @@ const float Tuning_Spec_Brightness = 0.35; const float Tuning_Spec_Power = 50.0; const float Tuning_Fres_Brightness = 1.0; +uniform vec2 resolution; + vec4 sampleCRT(vec2 uv) { - vec2 ScaledUV = uv; - ScaledUV *= UVScalar; - ScaledUV += UVOffset; + vec2 CRTMask_Scale = resolution / vec2(6.0, 5.0); - vec2 scanuv = ScaledUV * CRTMask_Scale; + vec2 scanuv = uv * CRTMask_Scale; vec3 scantex = texture(scanlinestex, scanuv).rgb; scantex += Tuning_Scanline_Brightness; scantex = mix(vec3(1,1,1), scantex, Tuning_Scanline_Opacity); - vec2 overscanuv = (ScaledUV * Tuning_Overscan) - ((Tuning_Overscan - 1.0f) * 0.5f); + vec2 overscanuv = (uv * Tuning_Overscan) - ((Tuning_Overscan - 1.0f) * 0.5f); overscanuv = overscanuv - vec2(0.5, 0.5); float rsq = (overscanuv.x*overscanuv.x) + (overscanuv.y*overscanuv.y); overscanuv = overscanuv + (overscanuv * (Tuning_Barrel * rsq)) + vec2(0.5,0.5); 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; static GLuint FramebufferName; // The framebuffer static GLuint depthrenderbuffer; +static int buffer_width = 1024; +static int buffer_height = 768; static GLuint ntscShader; // The NTSC shader static GLuint finalShader; // The passthrough shader @@ -249,6 +251,44 @@ void loadMesh(const char* filename, std::vector& out_vertices, std::v } } +void setFramebufferSize(GLFWwindow* w, int width, int height) +{ + buffer_width = width; + buffer_height = height; + + glDeleteFramebuffers(1, &FramebufferName); + glDeleteRenderbuffers(1, &depthrenderbuffer); + + glGenFramebuffers(1, &FramebufferName); + glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); + GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; + glDrawBuffers(1, DrawBuffers); + + glGenRenderbuffers(1, &depthrenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer); + + glDeleteTextures(1, &preBloomTex); + glDeleteTextures(1, &bloomPassTex); + + glGenTextures(1, &preBloomTex); + glBindTexture(GL_TEXTURE_2D, preBloomTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 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, width/16, height/16, 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); +} + GLFWwindow* initRenderer() { if (rendererInitialized) @@ -287,6 +327,8 @@ GLFWwindow* initRenderer() exit(-1); } + glfwSetFramebufferSizeCallback(window, &setFramebufferSize); + // Set up vertex array object glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); @@ -656,7 +698,7 @@ void renderWithoutEffects(Texture* tex) } glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0, 0, 1024, 768); + glViewport(0, 0, buffer_width, buffer_height); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(blitShader); @@ -755,7 +797,7 @@ void renderScreen(Texture* tex) // We're going to render the screen now glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, preBloomTex, 0); //glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0,0,1024,768); + glViewport(0,0,buffer_width,buffer_height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(finalShader); @@ -777,7 +819,7 @@ void renderScreen(Texture* tex) glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); // Initialize the MVP matrices - mat4 p_matrix = perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f); + mat4 p_matrix = perspective(45.0f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); mat4 v_matrix = lookAt(vec3(2,0,0), vec3(0,0,0), vec3(0,1,0)); mat4 m_matrix = mat4(1.0); mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; @@ -785,6 +827,7 @@ void renderScreen(Texture* tex) glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); + glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); @@ -805,7 +848,7 @@ void renderScreen(Texture* tex) // Do the first pass of bloom (downsampling and tapping) glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, bloomPassTex, 0); - glViewport(0, 0, 64, 48); + glViewport(0, 0, buffer_width/16, buffer_height/16); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(bloom1Shader); @@ -814,6 +857,7 @@ void renderScreen(Texture* tex) glUniform1i(glGetUniformLocation(bloom1Shader, "screenTex"), 0); glUniform1f(glGetUniformLocation(bloom1Shader, "iGlobalTime"), glfwGetTime()); + glUniform2f(glGetUniformLocation(bloom1Shader, "resolution"), buffer_width, buffer_height); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); @@ -823,7 +867,7 @@ void renderScreen(Texture* tex) // Do the second pass of bloom and render to screen glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0, 0, 1024, 768); + glViewport(0, 0, buffer_width, buffer_height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(bloom2Shader); @@ -836,6 +880,7 @@ void renderScreen(Texture* tex) glUniform1i(glGetUniformLocation(bloom2Shader, "downsampledTex"), 1); glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); + glUniform2f(glGetUniformLocation(bloom2Shader, "resolution"), buffer_width, buffer_height); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); -- cgit 1.4.1