77 lines
2.0 KiB
GLSL
77 lines
2.0 KiB
GLSL
#ifdef GL_ES
|
|
// Set default precision to medium
|
|
precision mediump int;
|
|
precision mediump float;
|
|
#endif
|
|
|
|
uniform vec3 eyeWorldPos;
|
|
uniform vec3 lightWorldPos;
|
|
|
|
uniform sampler2D texDiffuse;
|
|
uniform sampler2D texNormalMap;
|
|
|
|
// interpolated values
|
|
varying vec3 v_WorldPos;
|
|
varying vec3 v_CamPos;
|
|
varying vec3 v_normal;
|
|
varying vec2 v_texcoord;
|
|
varying mat3 normalMat;
|
|
|
|
void main() {
|
|
|
|
// diffuse fragment color
|
|
|
|
vec4 ambient = texture2D(texDiffuse, v_texcoord);
|
|
vec4 diffuse = ambient * vec4(0.8, 0.6, 0.35, 1.0);
|
|
vec4 specular = vec4(1,1,1,1);
|
|
|
|
// get the normal from the normal map
|
|
//vec3 normal = vec3(0,0,1);
|
|
vec3 normal = normalize(texture2D(texNormalMap, v_texcoord).rgb - 0.5) * 2.0;
|
|
// and convert from texture's normal-space into the object's normal-space using the normal-matrix
|
|
normal = normalize(normalMat * normal);
|
|
|
|
|
|
// direction from fragment towards the light
|
|
vec3 lightDir = normalize(lightWorldPos - v_WorldPos);
|
|
|
|
// direction from fragment towards the eye
|
|
vec3 eyeDir = normalize(eyeWorldPos - v_WorldPos);
|
|
|
|
|
|
// diffuse lighting
|
|
float diffuseIntensity = max(dot(lightDir, normal), 0.0);
|
|
|
|
// specular lighting
|
|
// vec3 h = normalize(lightDir + eyeDir);
|
|
// float intSpec = max(dot(h, normal), 0.0);
|
|
// float specularIntensity = pow(intSpec, 2.0);
|
|
float specularIntensity = pow(max(0.0, dot(eyeDir, reflect(-lightDir, normal))), 16);
|
|
|
|
|
|
// distance between fragment and light (in meter)
|
|
float distToLight_m = length(lightWorldPos - v_WorldPos);
|
|
float lightInt = clamp(1.0 / (distToLight_m / 10.0), 0.0, 1.0);
|
|
|
|
// Set fragment color from texture
|
|
vec4 finalColor =
|
|
ambient * 0.05 +
|
|
diffuse * 0.95 * diffuseIntensity * lightInt +
|
|
clamp(specular * specularIntensity, 0.0, 1.0) * 1.0;
|
|
|
|
gl_FragColor = clamp(finalColor, 0.0, 1.0);
|
|
|
|
// FOG
|
|
//float mixing = pow((1.0 - v_CamPos.z * 3.0), 2);
|
|
//gl_FragColor = mix(gl_FragColor, vec4(0.5, 0.5, 0.5, 1.0), 1.0-mixing);
|
|
|
|
//gl_FragColor = gl_FragColor * 1;
|
|
|
|
// gl_FragColor =
|
|
// ambient * 0.001 +
|
|
// diffuse * 0.009 * diffuseIntensity +
|
|
// specular * 0.6 * specularIntensity;
|
|
|
|
|
|
}
|