#version 150 in vec2 texCoord; in float fog_factor; // per-fragment interpolated values from the vertex shader in vec3 fN0; in vec3 fL0; in vec3 fE0; in vec3 fN1; in vec3 fL1; in vec3 fE1; out vec4 fColor; uniform sampler2D tex; uniform float obj_shi; uniform float plane_light_on; void main() { vec4 material_ambient; vec4 material_diffuse; vec4 material_specular; float material_shininess; if (texCoord.x > 10) { // cow fColor = vec4(0.1, 0.1, 0.1, 1); material_ambient = fColor; material_diffuse = vec4(1.0, 0.8, 0.0, 1.0); material_specular = vec4(1.0, 0.0, 1.0, 1.0); material_shininess = obj_shi; // cow's shininess } else { // tex fColor = texture(tex, texCoord); material_ambient = fColor; material_diffuse = fColor; material_specular = vec4(0.0, 0.0, 0.0, 0.0); material_shininess = 0.0; } // Normalize the input lighting vectors vec4 light0_ambient = vec4(0.2, 0.2, 0.2, 1.0); vec4 light0_diffuse = vec4(1.0, 1.0, 1.0, 1.0); vec4 light0_specular = vec4(1.0, 1.0, 1.0, 1.0); vec4 ambient_product0 = light0_ambient * material_ambient; vec4 diffuse_product0 = light0_diffuse * material_diffuse; vec4 specular_product0 = light0_specular * material_specular; vec3 N0 = normalize(fN0); vec3 E0 = normalize(fE0); vec3 L0 = normalize(fL0); vec3 H0 = normalize(L0 + E0); vec4 ambient0 = ambient_product0; float Kd0 = max(dot(L0, N0), 0.0); vec4 diffuse0 = Kd0 * diffuse_product0; float Ks0 = pow(max(dot(N0, H0), 0.0), material_shininess); vec4 specular0 = Ks0 * specular_product0; // discard the specular highlight if the light's behind the vertex if (dot(L0, N0) < 0.0) { specular0 = vec4(0.0, 0.0, 0.0, 1.0); } vec4 light1_ambient = vec4(0.2, 0.2, 0.2, 1.0); vec4 light1_diffuse = vec4(1.0, 1.0, 1.0, 1.0); vec4 light1_specular = vec4(1.0, 1.0, 1.0, 1.0); vec4 ambient_product1 = light1_ambient * material_ambient; vec4 diffuse_product1 = light1_diffuse * material_diffuse; vec4 specular_product1 = light1_specular * material_specular; vec3 N1 = normalize(fN1); vec3 E1 = normalize(fE1); vec3 L1 = normalize(fL1); vec3 H1 = normalize(L1 + E1); vec4 ambient1 = ambient_product0; float Kd1 = max(dot(L1, N1), 0.0); vec4 diffuse1 = Kd1 * diffuse_product1; float Ks1 = pow(max(dot(N1, H1), 0.0), material_shininess); vec4 specular1 = Ks1 * specular_product0; // discard the specular highlight if the light's behind the vertex if (dot(L1, N1) < 0.0) { specular1 = vec4(0.0, 0.0, 0.0, 1.0); } fColor = 0.5 * (plane_light_on * (ambient0 + diffuse0 + specular0) + (ambient1 + diffuse1 + specular1)); fColor.a = 1.0; // fog vec4 fogColor = vec4(0.5, 0.5, 0.5, 1); fColor = fColor * fog_factor + fogColor * (1 - fog_factor); }