52 lines
1.3 KiB
GLSL
52 lines
1.3 KiB
GLSL
#version 330 core
|
|
|
|
// material
|
|
uniform vec3 materialKd;
|
|
uniform vec3 materialKs;
|
|
uniform float materialNs;
|
|
|
|
uniform int nbDirLights;
|
|
uniform vec3 dirLights[16];
|
|
uniform int nbPointLights;
|
|
uniform vec3 pointLights[16];
|
|
|
|
// texture
|
|
uniform sampler2D baseTexture;
|
|
|
|
// fragment
|
|
in vec3 varNormal;
|
|
in vec2 varTexCoord;
|
|
|
|
in vec3 lightDirInView[8];
|
|
in vec3 halfVecInView[8];
|
|
|
|
// resultat
|
|
layout(location = 0)out vec4 outColor;
|
|
|
|
// --------------------
|
|
|
|
vec3 computeLight(in vec3 kd, in vec3 ks, in float ns, in vec3 color, in vec3 normal, in vec3 lightDir, in vec3 halfVec){
|
|
float diffuse = 0;
|
|
float specular = 0;
|
|
|
|
diffuse = dot(normal, lightDir);
|
|
diffuse = diffuse < 0 ? 0 : diffuse;
|
|
specular = dot(halfVec, normal);
|
|
specular = specular < 0 ? 0 : specular;
|
|
|
|
return color*diffuse*(kd+ks*pow(specular, ns));
|
|
}
|
|
|
|
void main(void) {
|
|
int i;
|
|
vec3 kd = vec3(texture2D(baseTexture, varTexCoord));
|
|
vec3 light = 0.1f*kd;
|
|
for(i=0; i<nbDirLights && i<8; ++i)
|
|
light += computeLight(kd, materialKs, materialNs, dirLights[i*2+1], varNormal, lightDirInView[i], halfVecInView[i]);
|
|
for(i=0; i<nbPointLights && i+nbDirLights<8; ++i)
|
|
light += computeLight(kd, materialKs, materialNs, pointLights[i*2+1], varNormal, lightDirInView[nbDirLights+i], halfVecInView[nbDirLights+i]);
|
|
|
|
outColor = vec4(light, 1);
|
|
}
|
|
|