diff options
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_downsample_maxz_frag.glsl')
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_downsample_maxz_frag.glsl | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_downsample_maxz_frag.glsl b/source/blender/gpu/shaders/gpu_shader_downsample_maxz_frag.glsl index 3229b41ffdb..3279023670c 100644 --- a/source/blender/gpu/shaders/gpu_shader_downsample_maxz_frag.glsl +++ b/source/blender/gpu/shaders/gpu_shader_downsample_maxz_frag.glsl @@ -31,14 +31,23 @@ float minmax(float a, float b) #endif } +float texelFetchLowermip(ivec2 texelPos) +{ +#if __VERSION__ < 130 + return texture2DLod(lowermip, (texelPos * lowermipsize + 0.5) / lowermipsize, 0.0).r; +#else + return texelFetch(lowermip, texelPos, 0).r; +#endif +} + void main() { vec4 texels; ivec2 texelPos = ivec2(gl_FragCoord.xy) * 2; - texels.x = texelFetch(lowermip, texelPos, 0).r; - texels.y = texelFetch(lowermip, texelPos + ivec2(1, 0), 0).r; - texels.z = texelFetch(lowermip, texelPos + ivec2(1, 1), 0).r; - texels.w = texelFetch(lowermip, texelPos + ivec2(0, 1), 0).r; + texels.x = texelFetchLowermip(texelPos); + texels.y = texelFetchLowermip(texelPos + ivec2(1, 0)); + texels.z = texelFetchLowermip(texelPos + ivec2(1, 1)); + texels.w = texelFetchLowermip(texelPos + ivec2(0, 1)); float minmaxz = minmax(texels.x, texels.y, texels.z, texels.w); vec3 extra; @@ -46,17 +55,17 @@ void main() if (((lowermipsize.x & 1) != 0) && (int(gl_FragCoord.x) == lowermipsize.x-3)) { /* if both edges are odd, fetch the top-left corner texel */ if (((lowermipsize.y & 1) != 0) && (int(gl_FragCoord.y) == lowermipsize.y-3)) { - extra.z = texelFetch(lowermip, texelPos + ivec2(-1, -1), 0).r; + extra.z = texelFetchLowermip(texelPos + ivec2(-1, -1)); minmaxz = minmax(minmaxz, extra.z); } - extra.x = texelFetch(lowermip, texelPos + ivec2(0, -1), 0).r; - extra.y = texelFetch(lowermip, texelPos + ivec2(1, -1), 0).r; + extra.x = texelFetchLowermip(texelPos + ivec2(0, -1)); + extra.y = texelFetchLowermip(texelPos + ivec2(1, -1)); minmaxz = minmax(minmaxz, extra.x, extra.y); } /* if we are reducing an odd-height texture then fetch the edge texels */ else if (((lowermipsize.y & 1) != 0) && (int(gl_FragCoord.y) == lowermipsize.y-3)) { - extra.x = texelFetch(lowermip, texelPos + ivec2(0, -1), 0).r; - extra.y = texelFetch(lowermip, texelPos + ivec2(1, -1), 0).r; + extra.x = texelFetchLowermip(texelPos + ivec2(0, -1)); + extra.y = texelFetchLowermip(texelPos + ivec2(1, -1)); minmaxz = minmax(minmaxz, extra.x, extra.y); } |