Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.glsl27
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);
}