66 lines
1.3 KiB
GLSL
66 lines
1.3 KiB
GLSL
#version 440
|
|
|
|
in vec3 f_color;
|
|
out vec4 FragColors;
|
|
|
|
uniform vec3 Ka;
|
|
uniform vec3 Ks;
|
|
uniform float Shininess;
|
|
|
|
struct LightInfo {
|
|
vec4 Position;
|
|
vec3 Intensity;
|
|
};
|
|
|
|
uniform LightInfo Light[64];
|
|
uniform int LightCount;
|
|
|
|
|
|
in vec3 fNormal;
|
|
in vec3 pos;
|
|
in mat3x3 tangentMatrix;
|
|
|
|
in vec2 texCoord;
|
|
uniform int TexCount;
|
|
uniform sampler2D tex[32];
|
|
|
|
uniform sampler2D nmap;
|
|
|
|
void main()
|
|
{
|
|
|
|
vec3 finalColor;
|
|
vec3 diffuse_sum;
|
|
vec3 specular_sum;
|
|
vec3 ambient_sum;
|
|
|
|
vec3 N = texture(nmap, texCoord).xyz;
|
|
|
|
vec4 Kd = texture(tex[0], texCoord);
|
|
for (int i=1; i < TexCount; i++)
|
|
{
|
|
vec4 new_tex = texture(tex[i], texCoord);
|
|
Kd = mix(new_tex, Kd, new_tex.a);
|
|
}
|
|
|
|
for (int i=0; i<LightCount; i++)
|
|
{
|
|
vec3 L = normalize(tangentMatrix * (Light[i].Position.xyz - pos));
|
|
|
|
vec3 V = normalize(tangentMatrix * (-pos));
|
|
//vec3 R = normalize(reflect(-L, N));
|
|
vec3 H = normalize(V + L);
|
|
|
|
vec3 ambient = Ka * Light[i].Intensity;
|
|
vec3 diffuse = Kd.xyz * Light[i].Intensity * max(dot(L, N), 0.0);
|
|
vec3 specular = Ks * Light[i].Intensity * pow(max(dot(H, N), 0.0), Shininess);
|
|
ambient_sum += ambient;
|
|
diffuse_sum += diffuse;
|
|
specular_sum += specular;
|
|
}
|
|
ambient_sum /= LightCount;
|
|
|
|
FragColors = (vec4(diffuse_sum + ambient_sum + specular_sum, 1));
|
|
|
|
}
|