47 lines
1.9 KiB
GLSL
47 lines
1.9 KiB
GLSL
#version 120
|
|
|
|
uniform sampler2D DiffuseSampler;
|
|
|
|
varying vec2 texCoord;
|
|
varying vec2 oneTexel;
|
|
|
|
uniform float LumaRamp;
|
|
uniform float LumaLevel;
|
|
|
|
void main(){
|
|
vec4 center = texture2D(DiffuseSampler, texCoord);
|
|
vec4 up = texture2D(DiffuseSampler, texCoord + vec2( 0.0, -oneTexel.y));
|
|
vec4 up2 = texture2D(DiffuseSampler, texCoord + vec2( 0.0, -oneTexel.y) * 2.0);
|
|
vec4 down = texture2D(DiffuseSampler, texCoord + vec2( oneTexel.x, 0.0));
|
|
vec4 down2 = texture2D(DiffuseSampler, texCoord + vec2( oneTexel.x, 0.0) * 2.0);
|
|
vec4 left = texture2D(DiffuseSampler, texCoord + vec2(-oneTexel.x, 0.0));
|
|
vec4 left2 = texture2D(DiffuseSampler, texCoord + vec2(-oneTexel.x, 0.0) * 2.0);
|
|
vec4 right = texture2D(DiffuseSampler, texCoord + vec2( 0.0, oneTexel.y));
|
|
vec4 right2 = texture2D(DiffuseSampler, texCoord + vec2( 0.0, oneTexel.y) * 2.0);
|
|
vec4 uDiff = abs(center - up);
|
|
vec4 dDiff = abs(center - down);
|
|
vec4 lDiff = abs(center - left);
|
|
vec4 rDiff = abs(center - right);
|
|
vec4 u2Diff = abs(center - up2);
|
|
vec4 d2Diff = abs(center - down2);
|
|
vec4 l2Diff = abs(center - left2);
|
|
vec4 r2Diff = abs(center - right2);
|
|
vec4 sum = uDiff + dDiff + lDiff + rDiff + u2Diff + d2Diff + l2Diff + r2Diff;
|
|
vec4 gray = vec4(0.3, 0.59, 0.11, 0.0);
|
|
float sumLuma = 1.0 - dot(clamp(sum, 0.0, 1.0), gray);
|
|
|
|
// Get luminance of center pixel and adjust
|
|
float centerLuma = dot(center + (center - pow(center, vec4(LumaRamp))), gray);
|
|
|
|
// Quantize the luma value
|
|
centerLuma = centerLuma - fract(centerLuma * LumaLevel) / LumaLevel;
|
|
|
|
// Re-scale to full range
|
|
centerLuma = centerLuma * (LumaLevel / (LumaLevel - 1.0));
|
|
|
|
// Blend with outline
|
|
centerLuma = centerLuma * sumLuma;
|
|
|
|
gl_FragColor = vec4(centerLuma, centerLuma, centerLuma, 1.0);
|
|
}
|