#version 300 es precision mediump float; in vec3 vertPosition; in vec2 vertTexCoord; in mat3 vertTBNMatrix; in vec4 vertColor; uniform vec3 light0Position; uniform vec3 light1Position; uniform vec3 light2Direction; uniform vec3 light0Color; uniform vec3 light1Color; uniform vec3 light2Color; uniform vec3 ambientColor; uniform vec3 specularColor; uniform float specularExponent; uniform vec3 emissiveColor; uniform vec3 cameraPosition; uniform sampler2D colorTexture; uniform sampler2D normalTexture; out vec4 fragColor; vec3 applyDirectionalLight(vec3 lightToSurface, vec3 lightColor, vec3 surfaceColor, vec3 normal, vec3 surfacePosition, vec3 surfaceToCamera) { float diffuseStrength = max(dot(normal, -lightToSurface), 0.0); vec3 diffuseOutput = diffuseStrength * lightColor; float specularStrength = pow(max(0.0, dot(surfaceToCamera, reflect(lightToSurface, normal))), shininess); vec3 specularOutput = specularColor * specularStrength * lightColor; return (diffuseOutput + specularOutput) * surfaceColor; } vec3 applyPointLight(vec3 lightPosition, vec3 lightColor, vec3 surfaceColor, vec3 normal, vec3 surfacePosition, vec3 surfaceToCamera) { return applyDirectionalLight(normalize(surfacePosition - lightPosition), lightColor, surfaceColor, normal, surfacePosition, surfaceToCamera); } void main() { vec4 textureColor = texture(colorTexture, vertTexCoord) * vertColor; vec3 surfaceToCamera = normalize(cameraPosition - vertPosition); vec3 normal = texture(normalTexture, vertTexCoord).rgb; normal = normal * 2.0 - 1.0; normal = normalize(vertTBNMatrix * normal); vec3 litColor = applyPointLight(light0Position, light0Color, textureColor.rgb, normal, vertPosition, surfaceToCamera); litColor += applyPointLight(light1Position, light1Color, textureColor.rgb, normal, vertPosition, surfaceToCamera); litColor += applyDirectionalLight(light2Direction, light2Color, textureColor.rgb, normal, vertPosition, surfaceToCamera); litColor += ambientColor * textureColor.rgb; fragColor = vec4(emissiveColor * vec3(textureColor) + (vec3(1.0, 1.0, 1.0) - emissiveColor) * litColor, textureColor.a); }