#version 330 out vec4 fsColor; in vec2 vsUV; uniform vec2 viewportSize; #define LINE_WEIGHT 1.0 uniform sampler2D gbufferNormals; uniform sampler2D gbufferAlbedo; uniform sampler2D gbufferMask; void main() { float dx = (1.0 / viewportSize.x) * LINE_WEIGHT; float dy = (1.0 / viewportSize.y) * LINE_WEIGHT; vec2 uvCenter = vsUV; vec2 uvRight = vec2(uvCenter.x + dx, uvCenter.y); vec2 uvTop = vec2(uvCenter.x, uvCenter.y - dx); vec2 uvTopRight = vec2(uvCenter.x + dx, uvCenter.y - dx); vec3 mCenter = texture(gbufferNormals, uvCenter).rgb; vec3 mTop = texture(gbufferNormals, uvTop).rgb; vec3 mRight = texture(gbufferNormals, uvRight).rgb; vec3 mTopRight = texture(gbufferNormals, uvTopRight).rgb; vec3 dT = abs(mCenter - mTop); vec3 dR = abs(mCenter - mRight); vec3 dTR = abs(mCenter - mTopRight); float dTmax = max(dT.x, max(dT.y, dT.z)); float dRmax = max(dR.x, max(dR.y, dR.z)); float dTRmax = max(dTR.x, max(dTR.y, dTR.z)); float deltaRaw = 0.0; deltaRaw = max(deltaRaw, dTmax); deltaRaw = max(deltaRaw, dRmax); deltaRaw = max(deltaRaw, dTRmax); // Lower threshold values will discard fewer samples // and give darker/thicker lines. float threshold = 0.8; float deltaClipped = clamp((deltaRaw * 2.0) - threshold, 0.0, 1.0); float oI = deltaClipped; vec4 outline = vec4(oI, oI, oI, 1.0); vec4 albedo = texture(gbufferAlbedo, vsUV); fsColor = albedo - outline; }