Files
vr-poser/assets/shaders/cel.frag
2026-03-15 22:03:30 -04:00

38 lines
934 B
GLSL

#version 130
varying vec3 v_normalVS;
varying vec3 v_posVS;
varying vec2 v_uv;
varying vec4 v_color;
uniform sampler2D osg_Sampler0;
uniform bool u_hasTexture;
uniform vec3 u_lightDirVS;
uniform vec3 u_lightColor;
uniform vec3 u_ambientColor;
uniform int u_bands;
uniform float u_bandSharpness;
float celQuantise(float value, int bands) {
float b = float(bands);
return floor(value * b + 0.5) / b;
}
void main() {
vec3 N = normalize(v_normalVS);
vec3 L = normalize(u_lightDirVS);
// Half-lambert so shadows aren't pitch black
float NdL = dot(N, L) * 0.5 + 0.5;
float celVal = celQuantise(NdL, u_bands);
vec4 baseColor = u_hasTexture
? texture2D(osg_Sampler0, v_uv)
: v_color;
vec3 diffuse = baseColor.rgb * u_lightColor * celVal;
vec3 ambient = baseColor.rgb * u_ambientColor;
gl_FragColor = vec4(ambient + diffuse, baseColor.a);
}