normalize-languages 0.3.2

Tree-sitter language support and dynamic grammar loading
Documentation
#version 450 core

#include "common.glsl"
#include "lighting.glsl"
#include <pbr_utils.glsl>

// Uniforms
uniform mat4 u_Model;
uniform mat4 u_View;
uniform mat4 u_Projection;
uniform vec3 u_LightPos;
uniform vec3 u_CameraPos;
uniform sampler2D u_AlbedoMap;
uniform sampler2D u_NormalMap;

// Input/output
in vec3 v_Position;
in vec3 v_Normal;
in vec2 v_TexCoord;
in vec4 v_Color;

out vec4 fragColor;

struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
};

vec3 calculateDiffuse(vec3 normal, vec3 lightDir, vec3 lightColor) {
    float diff = max(dot(normal, lightDir), 0.0);
    return diff * lightColor;
}

vec3 calculateSpecular(vec3 normal, vec3 lightDir, vec3 viewDir, float shininess) {
    vec3 reflectDir = reflect(-lightDir, normal);
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), shininess);
    return spec * vec3(1.0);
}

vec3 applyFog(vec3 color, float depth) {
    float fogFactor = exp(-depth * 0.01);
    return mix(vec3(0.5, 0.6, 0.7), color, fogFactor);
}

void main() {
    vec3 norm = normalize(v_Normal);
    vec3 lightDir = normalize(u_LightPos - v_Position);
    vec3 viewDir = normalize(u_CameraPos - v_Position);

    vec4 albedo = texture(u_AlbedoMap, v_TexCoord);
    vec3 diffuse = calculateDiffuse(norm, lightDir, vec3(1.0));
    vec3 specular = calculateSpecular(norm, lightDir, viewDir, 32.0);

    vec3 result = (vec3(0.1) + diffuse + specular) * albedo.rgb;
    float depth = length(u_CameraPos - v_Position);
    result = applyFog(result, depth);

    fragColor = vec4(result, albedo.a);
}