#version 330 in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; in vec4 vertexColor; uniform mat4 mvp; uniform mat4 matNormal; uniform vec3 sun_direction; uniform vec3 sun_colour; uniform float sun_intensity; uniform vec3 moon_direction; uniform vec3 moon_colour; uniform float moon_intensity; uniform vec3 ambient_colour; uniform float ambient_intensity; uniform vec2 uv_tiling; uniform vec2 uv_offset; out vec2 frag_texcoord; out vec4 frag_colour; out vec3 frag_lighting; void main() { vec3 world_normal = normalize((matNormal * vec4(vertexNormal, 0.0)).xyz); // float sun_diffuse = abs(dot(world_normal, sun_direction)); // float moon_diffuse = abs(dot(world_normal, moon_direction)); // for stronger shading, use 0.3 + 0.7 * abs(...) // float sun_diffuse = 0.5 + 0.5 * abs(dot(world_normal, sun_direction)); // float moon_diffuse = 0.5 + 0.5 * abs(dot(world_normal, moon_direction)); float sun_diffuse = abs(dot(world_normal, sun_direction)); float moon_diffuse = abs(dot(world_normal, moon_direction)); // hack to fix lighting at midday float midday = smoothstep(0.7, 1.0, sun_direction.y); sun_diffuse = mix(sun_diffuse, 0.65, midday); vec3 ambient_light = ambient_colour * ambient_intensity; vec3 sun_light = sun_colour * sun_intensity * sun_diffuse; vec3 moon_light = moon_colour * moon_intensity * moon_diffuse; frag_lighting = ambient_light + sun_light + moon_light; frag_texcoord = vertexTexCoord * uv_tiling + uv_offset; frag_colour = vertexColor; gl_Position = mvp * vec4(vertexPosition, 1.0); }