precision mediump float; uniform sampler2D uMap; uniform vec3 uHighlightColor; uniform float uHighlightIntensity; varying vec2 vUv; varying vec3 vNormal; varying float vHighlightStrength; varying float vGlitchStrength; const vec3 LIGHT_DIR = vec3(0.8, 0.85, 1.0); const float AMBIENT_INTENSITY = 0.95; const float DIFFUSE_INTENSITY = 0.1; const float SHIFT_OFFSET = 0.075; void main() { // --- 1. Texture Sampling with RGB Shift --- float shift = vGlitchStrength * SHIFT_OFFSET; float r = texture2D(uMap, vUv + vec2(shift, 0.0)).r; float g = texture2D(uMap, vUv).g; float b = texture2D(uMap, vUv - vec2(shift, 0.0)).b; vec4 texColor = vec4(r, g, b, 1.0); // --- 2. Lighting --- vec3 normLightDir = normalize(LIGHT_DIR); float diff = max(dot(vNormal, normLightDir), 0.0); vec3 ambient = vec3(AMBIENT_INTENSITY); vec3 diffuse = vec3(DIFFUSE_INTENSITY) * diff; vec3 lighting = ambient + diffuse; vec3 finalColor = texColor.rgb * lighting; // --- 3. Highlight Composition --- float effectIntensity = vHighlightStrength * uHighlightIntensity; finalColor = mix(finalColor, uHighlightColor, effectIntensity); gl_FragColor = vec4(finalColor, texColor.a); }