diff --git a/.vs/grk-project/v16/.suo b/.vs/grk-project/v16/.suo index a098aaa..df18e34 100644 Binary files a/.vs/grk-project/v16/.suo and b/.vs/grk-project/v16/.suo differ diff --git a/.vs/grk-project/v16/Browse.VC.db b/.vs/grk-project/v16/Browse.VC.db index 9e4f8b1..bd06a15 100644 Binary files a/.vs/grk-project/v16/Browse.VC.db and b/.vs/grk-project/v16/Browse.VC.db differ diff --git a/cw 9/shaders/shader_blur.frag b/cw 9/shaders/shader_blur.frag index 967af0d..5fb620e 100644 --- a/cw 9/shaders/shader_blur.frag +++ b/cw 9/shaders/shader_blur.frag @@ -1,18 +1,32 @@ -#version 430 core -layout (location = 0) out vec3 gPosition; -layout (location = 1) out vec3 gNormal; -layout (location = 2) out vec3 gAlbedo; - +#version 330 core +out vec4 FragColor; + in vec2 TexCoords; -in vec3 FragPos; -in vec3 Normal; + +uniform sampler2D image; + +uniform bool horizontal; +uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); void main() -{ - // store the fragment position vector in the first gbuffer texture - gPosition = FragPos; - // also store the per-fragment normals into the gbuffer - gNormal = normalize(Normal); - // and the diffuse per-fragment color - gAlbedo.rgb = vec3(0.95); +{ + vec2 tex_offset = 1.0 / textureSize(image, 0); // gets size of single texel + vec3 result = texture(image, TexCoords).rgb * weight[0]; // current fragment's contribution + if(horizontal) + { + for(int i = 1; i < 5; ++i) + { + result += texture(image, TexCoords + vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; + result += texture(image, TexCoords - vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; + } + } + else + { + for(int i = 1; i < 5; ++i) + { + result += texture(image, TexCoords + vec2(0.0, tex_offset.y * i)).rgb * weight[i]; + result += texture(image, TexCoords - vec2(0.0, tex_offset.y * i)).rgb * weight[i]; + } + } + FragColor = vec4(result, 1.0); } \ No newline at end of file diff --git a/cw 9/shaders/shader_blur.vert b/cw 9/shaders/shader_blur.vert index 7e73bf3..01dcb0d 100644 --- a/cw 9/shaders/shader_blur.vert +++ b/cw 9/shaders/shader_blur.vert @@ -1,27 +1,14 @@ #version 430 core -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; +layout(location = 0) in vec3 vertexPosition; +layout(location = 1) in vec3 vertexNormal; +layout(location = 2) in vec2 vertexTexCoord; + -out vec3 FragPos; out vec2 TexCoords; -out vec3 Normal; - -uniform bool invertedNormals; - -uniform mat4 model; -uniform mat4 view; -uniform mat4 projection; void main() { - vec4 viewPos = view * model * vec4(aPos, 1.0); - FragPos = viewPos.xyz; - TexCoords = aTexCoords; - - mat3 normalMatrix = transpose(inverse(mat3(view * model))); - Normal = normalMatrix * (invertedNormals ? -aNormal : aNormal); - - gl_Position = projection * viewPos; -} + gl_Position = vec4(vertexPosition, 1.0); + TexCoords = vertexTexCoord; +} \ No newline at end of file diff --git a/cw 9/shaders/shader_geometrypass.frag b/cw 9/shaders/shader_geometrypass.frag index 28d4cf0..e056787 100644 --- a/cw 9/shaders/shader_geometrypass.frag +++ b/cw 9/shaders/shader_geometrypass.frag @@ -1,48 +1,18 @@ -#version 330 core -out vec4 FragColor; - -in vec2 tc; +#version 430 +layout (location = 0) out vec3 gPosition; +layout (location = 1) out vec3 gNormal; +layout (location = 2) out vec3 gAlbedo; -uniform sampler2D color; -uniform sampler2D highlight; - -float rescale_z(float z){ - float n = 0.05; - float f = 20.; - return (2*n*f/(z*(n-f)+n+f))/f; -} -float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); - -vec4 blur() -{ - vec2 tex_offset = 1.0 / textureSize(color, 0); // gets size of single texel - vec3 result = texture(highlight, tc).rgb * weight[0]; // current fragment's contribution - bool horizontal = true; - if(horizontal) - { - for(int i = 1; i < 5; ++i) - { - result += texture(highlight, tc + vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; - result += texture(highlight, tc - vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; - } - } - else - { - for(int i = 1; i < 5; ++i) - { - result += texture(highlight, tc + vec2(0.0, tex_offset.y * i)).rgb * weight[i]; - result += texture(highlight, tc - vec2(0.0, tex_offset.y * i)).rgb * weight[i]; - } - } - return vec4(result, 1.0); -} +in vec2 TexCoords; +in vec3 FragPos; +in vec3 Normal; void main() -{ - //float depthValue = texture(depthMap, tc).r; - //FragColor = vec4(vec3(rescale_z(depthValue)+0.5), 1.0); - //FragColor = vec4(vec3((depthValue)+0.5), 1.0); - - FragColor = vec4(texture(highlight, tc).rgb+texture(color, tc).rgb,1); - //FragColor = vec4( (texture(color, tc)-0.98)*50); -} \ No newline at end of file +{ + // store the fragment position vector in the first gbuffer texture + gPosition = FragPos; + // also store the per-fragment normals into the gbuffer + gNormal = normalize(Normal); + // and the diffuse per-fragment color + gAlbedo.rgb = vec3(0.95); +} \ No newline at end of file diff --git a/cw 9/shaders/shader_geometrypass.vert b/cw 9/shaders/shader_geometrypass.vert index 64c558f..1644b0b 100644 --- a/cw 9/shaders/shader_geometrypass.vert +++ b/cw 9/shaders/shader_geometrypass.vert @@ -1,14 +1,28 @@ #version 430 core +layout (location = 0) out vec3 vertexPosition; +layout (location = 1) out vec3 vertexNormal; +layout (location = 2) in vec2 vertexTexCoords; -layout(location = 0) in vec3 vertexPosition; -layout(location = 1) in vec3 vertexNormal; -layout(location = 2) in vec2 vertexTexCoord; +out vec3 FragPos; +out vec2 TexCoords; +out vec3 Normal; +uniform bool invertedNormals; -out vec2 tc; +uniform mat4 modelMatrix; +uniform mat3 transformation; + +uniform mat4 view; +uniform mat4 projection; void main() { - tc = vertexTexCoord; - gl_Position = vec4(vertexPosition, 1.0); -} + vec4 viewPos = transformation * vec4(vertexPosition, 1.0); + FragPos = viewPos.xyz; + TexCoord = vertexTexCoords; + + mat3 normalMatrix = transpose(inverse(mat3( * model))); + Normal = normalMatrix * (invertedNormals ? -aNormal : aNormal); + + gl_Position = viewPos; +} \ No newline at end of file diff --git a/cw 9/src/room.hpp b/cw 9/src/room.hpp index 9236968..f6769ea 100644 --- a/cw 9/src/room.hpp +++ b/cw 9/src/room.hpp @@ -253,6 +253,9 @@ void drawSkyBox(Core::RenderContext& context, glm::mat4 modelMatrix) { void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec3 color, float roughness, float metallic) { + geometryPass(modelMatrix); + glUseProgram(program); + glActiveTexture(GL_TEXTURE0); glUniform1i(glGetUniformLocation(program, "depthMap"), 0); glBindTexture(GL_TEXTURE_2D, depthMap); @@ -265,6 +268,7 @@ void drawObjectPBR(Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 transformation = viewProjectionMatrix * modelMatrix; + glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); @@ -432,31 +436,16 @@ void initgBuffer() glDrawBuffers(3, attachments); } -void geometryPass() +void geometryPass(glm::mat4 modelMatrix) { glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)WIDTH / (float)HEIGHT, 0.1f, 50.0f); - glm::mat4 view = camera.GetViewMatrix(); - glm::mat4 model = glm::mat4(1.0f); glUseProgram(programGeometryPass); - shaderGeometryPass.setMat4("projection", projection); - shaderGeometryPass.setMat4("view", view); - // room cube - model = glm::mat4(1.0f); - model = glm::translate(model, glm::vec3(0.0, 7.0f, 0.0f)); - model = glm::scale(model, glm::vec3(7.5f, 7.5f, 7.5f)); - shaderGeometryPass.setMat4("model", model); - shaderGeometryPass.setInt("invertedNormals", 1); // invert normals as we're inside the cube - renderCube(); - shaderGeometryPass.setInt("invertedNormals", 0); - // backpack model on the floor - model = glm::mat4(1.0f); - model = glm::translate(model, glm::vec3(0.0f, 0.5f, 0.0)); - model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(1.0, 0.0, 0.0)); - model = glm::scale(model, glm::vec3(1.0f)); - shaderGeometryPass.setMat4("model", model); - backpack.Draw(shaderGeometryPass); + glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); + glm::mat4 transformation = viewProjectionMatrix * modelMatrix; + glUniformMatrix4fv(glGetUniformLocation(programGeometryPass, "transformation"), 1, GL_FALSE, (float*)&transformation); + glUniformMatrix4fv(glGetUniformLocation(programGeometryPass, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); + glUniform1i(glGetUniformLocation(programGeometryPass, "invertedNormals"), 0); glBindFramebuffer(GL_FRAMEBUFFER, 0); }