diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2021-10-23 00:23:50 +0200 | 
|---|---|---|
| committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2021-11-16 22:11:32 +0100 | 
| commit | 99547d2656ee8e84b684794fa8e013b146f15284 (patch) | |
| tree | 4f4f85d92af3afe00527901f4c6670a7d78c162f /src/video_core | |
| parent | a96c9c803be9aca0b9775c37c1e77e13cca56c80 (diff) | |
HostShader: Fix gaussian and add attribution.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/host_shaders/present_gaussian.frag | 42 | 
1 files changed, 19 insertions, 23 deletions
| diff --git a/src/video_core/host_shaders/present_gaussian.frag b/src/video_core/host_shaders/present_gaussian.frag index d5e2b1781..a9558548f 100644 --- a/src/video_core/host_shaders/present_gaussian.frag +++ b/src/video_core/host_shaders/present_gaussian.frag @@ -2,6 +2,10 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +// Code obtained from this 2 sources: +// - https://learnopengl.com/Advanced-Lighting/Bloom +// - https://www.rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/ +  #version 460 core  #ifdef VULKAN @@ -14,50 +18,40 @@  #endif -layout (location = 0) in vec2 frag_tex_coord; +layout(location = 0) in vec2 frag_tex_coord; -layout (location = 0) out vec4 color; +layout(location = 0) out vec4 color; -layout (binding = BINDING_COLOR_TEXTURE) uniform sampler2D color_texture; +layout(binding = BINDING_COLOR_TEXTURE) uniform sampler2D color_texture;  const float offset[3] = float[](0.0, 1.3846153846, 3.2307692308);  const float weight[3] = float[](0.2270270270, 0.3162162162, 0.0702702703);  vec4 blurVertical(sampler2D textureSampler, vec2 coord, vec2 norm) {      vec4 result = vec4(0.0f); -    for (int i=1; i<3; i++) { -        result += -            texture(textureSampler, vec2(coord) + (vec2(0.0, offset[i]) * norm)) -                * weight[i]; -        result += -            texture(textureSampler, vec2(coord) - (vec2(0.0, offset[i]) * norm)) -                * weight[i]; +    for (int i = 1; i < 3; i++) { +        result += texture(textureSampler, vec2(coord) + (vec2(0.0, offset[i]) * norm)) * weight[i]; +        result += texture(textureSampler, vec2(coord) - (vec2(0.0, offset[i]) * norm)) * weight[i];      }      return result;  }  vec4 blurHorizontal(sampler2D textureSampler, vec2 coord, vec2 norm) {      vec4 result = vec4(0.0f); -    for (int i=1; i<3; i++) { -        result += -            texture(textureSampler, vec2(coord) + (vec2(offset[i], 0.0) * norm)) -                * weight[i]; -        result += -            texture(textureSampler, vec2(coord) - (vec2(offset[i], 0.0) * norm)) -                * weight[i]; +    for (int i = 1; i < 3; i++) { +        result += texture(textureSampler, vec2(coord) + (vec2(offset[i], 0.0) * norm)) * weight[i]; +        result += texture(textureSampler, vec2(coord) - (vec2(offset[i], 0.0) * norm)) * weight[i];      }      return result;  }  vec4 blurDiagonal(sampler2D textureSampler, vec2 coord, vec2 norm) {      vec4 result = vec4(0.0f); -    for (int i=1; i<3; i++) { +    for (int i = 1; i < 3; i++) {          result += -            texture(textureSampler, vec2(coord) + (vec2(offset[i], offset[i]) * norm)) -                * weight[i]; +            texture(textureSampler, vec2(coord) + (vec2(offset[i], offset[i]) * norm)) * weight[i];          result += -            texture(textureSampler, vec2(coord) - (vec2(offset[i], offset[i]) * norm)) -                * weight[i]; +            texture(textureSampler, vec2(coord) - (vec2(offset[i], offset[i]) * norm)) * weight[i];      }      return result;  } @@ -65,10 +59,12 @@ vec4 blurDiagonal(sampler2D textureSampler, vec2 coord, vec2 norm) {  void main() {      vec3 base = texture(color_texture, vec2(frag_tex_coord)).rgb * weight[0];      vec2 tex_offset = 1.0f / textureSize(color_texture, 0); + +    // TODO(Blinkhawk): This code can be optimized through shader group instructions.      vec3 horizontal = blurHorizontal(color_texture, frag_tex_coord, tex_offset).rgb;      vec3 vertical = blurVertical(color_texture, frag_tex_coord, tex_offset).rgb;      vec3 diagonalA = blurVertical(color_texture, frag_tex_coord, tex_offset).rgb; -    vec3 diagonalB = blurVertical(color_texture, frag_tex_coord, -tex_offset).rgb; +    vec3 diagonalB = blurVertical(color_texture, frag_tex_coord, tex_offset * vec2(1.0, -1.0)).rgb;      vec3 combination = mix(mix(horizontal, vertical, 0.5f), mix(diagonalA, diagonalB, 0.5f), 0.5f);      color = vec4(combination + base, 1.0f);  } | 
