#version 430 in vec2 uv; out vec4 final_color; uniform sampler2D tex; subroutine vec4 shading_t(vec4 color); subroutine uniform shading_t Shading; const float f = 1.0 / 300.0; vec2 offsets[9] = vec2[]( vec2(-f, f), vec2(0.0, f), vec2(f, f), vec2(-f, 0.0), vec2(0.0, 0.0), vec2(f, 0.0), vec2(-f, -f), vec2(0.0, -f), vec2(f, -f) ); subroutine(shading_t) vec4 sepia(vec4 color) { return vec4(color.r * .393 + color.g * .769 + color.b * .189, color.r * .349 + color.g * .686 + color.b * .168, color.r * .272 + color.g * .534 + color.b * .131, 1.0); } subroutine(shading_t) vec4 grayscale(vec4 color) { float average = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722; return vec4(average, average, average, 1); } subroutine(shading_t) vec4 depthing(vec4 color) { float zNear = 0.1f; // zNear of your perspective projection float zFar = 2000.0f; // zFar of your perspective projection float depth = color.x; float r = (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear)); return vec4(r, r, r, 1); } subroutine(shading_t) vec4 blurring(vec4 color) { float blur_kernel[9] = float[]( 1.0 / 16, 2.0 / 16, 1.0 / 16, 2.0 / 16, 4.0 / 16, 2.0 / 16, 1.0 / 16, 2.0 / 16, 1.0 / 16 ); vec3 texblur = vec3(0,0,0); for (int i = 0; i < 9; i++) texblur += vec3(texture(tex, uv + offsets[i]).rgb * blur_kernel[i]); return vec4(texblur, 1); } subroutine(shading_t) vec4 sharpening(vec4 color) { float sharp_kernel[9] = float[]( -1, -1, -1, -1, 9, -1, -1, -1, -1 ); vec3 texsharp = vec3(0,0,0); for (uint i = 0; i < 9; i++) texsharp += texture(tex, uv + offsets[i]).rgb * sharp_kernel[i]; return vec4(texsharp, 1); } subroutine(shading_t) vec4 sobel_filter(vec4 color) { float sobel_x[9] = float[]( -1, 0, 1, -2, 0, 2, -1, 0, 1 ); float sobel_y[9] = float[]( -1, -2, -1, 0, 0, 0, 1, 2, 1 ); vec3 vec_x = vec3(0); vec3 vec_y = vec3(0); for (int i = 0; i < 9; i++) { vec_x += texture(tex, uv + offsets[i]).rgb * sobel_x[i]; vec_y += texture(tex, uv + offsets[i]).rgb * sobel_y[i]; } vec4 sobeled = vec4(sqrt(vec_x * vec_x + vec_y * vec_y), 1); return grayscale(sobeled); } void main() { //rrra because depth textures are not usual textures, they have only one channel final_color = texture(tex, uv).rgba; final_color = Shading(final_color); // if (depth) { // float d; // d = LinearizeDepth(uv); // final_color = vec4(d,d,d,1.0); // } // else if (blur) // { // final_color = vec4(blurring_func(uv), 1); // } // else if (sharpen) // { // final_color = vec4(sharpening_func(uv)); // } // else if (sepia) // { // final_color = vec4(final_color.r * .393 + final_color.g * .769 + final_color.b * .189, // final_color.r * .349 + final_color.g * .686 + final_color.b * .168, // final_color.r * .272 + final_color.g * .534 + final_color.b * .131, 1.0); // } // else if (grayscale) // { // float average = final_color.r * 0.2126 + final_color.g * 0.7152 + final_color.b * 0.0722; // final_color = vec4(average, average, average, 1.0); // } // else if (sobel) // { // vec3 sobeled = sobel_filter(final_color.rgb); // float average = sobeled.r * 0.2126 + sobeled.g * 0.7152 + sobeled.b * 0.0722; // final_color = vec4(average, average, average, 1.0); // } }