minecraft-assets/assets/minecraft/shaders/program/outline_soft.fsh

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);
}