PIXELLATE.glsl (3494B)
1 // Pixellate Shader 2 // Copyright (c) 2011, 2012 Fes 3 // Permission to use, copy, modify, and/or distribute this software for any 4 // purpose with or without fee is hereby granted, provided that the above 5 // copyright notice and this permission notice appear in all copies. 6 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 7 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 8 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 9 // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 10 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 11 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 12 // IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 13 // (Fes gave their permission to have this shader distributed under this 14 // licence in this forum post: 15 // http://board.byuu.org/viewtopic.php?p=57295#p57295 16 17 18 /* 19 [configuration] 20 21 [OptionRangeFloat] 22 GUIName = Linear Gamma Weight 23 OptionName = INTERPOLATE_IN_LINEAR_GAMMA 24 MinValue = 0.0 25 MaxValue = 1.0 26 StepAmount = 1.0 27 DefaultValue = 1.0 28 29 [/configuration] 30 */ 31 32 void main() 33 { 34 vec2 vTexCoord = GetCoordinates(); 35 vec2 SourceSize = 1.0 / GetInvNativePixelSize(); 36 vec2 texelSize = 1.0 / SourceSize.xy; 37 vec2 OutputSize = GetWindowSize().xy; 38 39 vec2 range = vec2(abs(SourceSize.x / (OutputSize.x * SourceSize.x)), abs(SourceSize.y / (OutputSize.y * SourceSize.y))); 40 range = range / 2.0 * 0.999; 41 42 float left = vTexCoord.x - range.x; 43 float top = vTexCoord.y + range.y; 44 float right = vTexCoord.x + range.x; 45 float bottom = vTexCoord.y - range.y; 46 47 vec3 topLeftColor; 48 vec3 bottomRightColor; 49 vec3 bottomLeftColor; 50 vec3 topRightColor; 51 52 if (GetOption(INTERPOLATE_IN_LINEAR_GAMMA) > 0.5){ 53 topLeftColor = pow(SampleLocation((floor(vec2(left, top) / texelSize) + vec2(0.5)) * texelSize).rgb, vec3(2.2)); 54 bottomRightColor = pow(SampleLocation((floor(vec2(right, bottom) / texelSize) + vec2(0.5)) * texelSize).rgb, vec3(2.2)); 55 bottomLeftColor = pow(SampleLocation((floor(vec2(left, bottom) / texelSize) + vec2(0.5)) * texelSize).rgb, vec3(2.2)); 56 topRightColor = pow(SampleLocation((floor(vec2(right, top) / texelSize) + vec2(0.5)) * texelSize).rgb, vec3(2.2)); 57 }else{ 58 topLeftColor = SampleLocation((floor(vec2(left, top) / texelSize) + vec2(0.5)) * texelSize).rgb; 59 bottomRightColor = SampleLocation((floor(vec2(right, bottom) / texelSize) + vec2(0.5)) * texelSize).rgb; 60 bottomLeftColor = SampleLocation((floor(vec2(left, bottom) / texelSize) + vec2(0.5)) * texelSize).rgb; 61 topRightColor = SampleLocation((floor(vec2(right, top) / texelSize) + vec2(0.5)) * texelSize).rgb;} 62 63 vec2 border = clamp(round(vTexCoord / texelSize) * texelSize, vec2(left, bottom), vec2(right, top)); 64 65 float totalArea = 4.0 * range.x * range.y; 66 67 vec3 averageColor; 68 averageColor = ((border.x - left) * (top - border.y) / totalArea) * topLeftColor; 69 averageColor += ((right - border.x) * (border.y - bottom) / totalArea) * bottomRightColor; 70 averageColor += ((border.x - left) * (border.y - bottom) / totalArea) * bottomLeftColor; 71 averageColor += ((right - border.x) * (top - border.y) / totalArea) * topRightColor; 72 73 vec4 color = (GetOption(INTERPOLATE_IN_LINEAR_GAMMA) > 0.5) ? vec4(pow(averageColor, vec3(1.0 / 2.2)), 1.0) : vec4(averageColor, 1.0); 74 75 SetOutput(color); 76 }