fshader71.glsl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #version 150
  2. in vec2 texCoord;
  3. in float fog_factor;
  4. // per-fragment interpolated values from the vertex shader
  5. in vec3 fN0;
  6. in vec3 fL0;
  7. in vec3 fE0;
  8. in vec3 fN1;
  9. in vec3 fL1;
  10. in vec3 fE1;
  11. out vec4 fColor;
  12. uniform sampler2D tex;
  13. uniform float obj_shi;
  14. uniform float plane_light_on;
  15. void main() {
  16. vec4 material_ambient;
  17. vec4 material_diffuse;
  18. vec4 material_specular;
  19. float material_shininess;
  20. if (texCoord.x > 10) { // cow
  21. fColor = vec4(0.1, 0.1, 0.1, 1);
  22. material_ambient = fColor;
  23. material_diffuse = vec4(1.0, 0.8, 0.0, 1.0);
  24. material_specular = vec4(1.0, 0.0, 1.0, 1.0);
  25. material_shininess = obj_shi; // cow's shininess
  26. } else { // tex
  27. fColor = texture(tex, texCoord);
  28. material_ambient = fColor;
  29. material_diffuse = fColor;
  30. material_specular = vec4(0.0, 0.0, 0.0, 0.0);
  31. material_shininess = 0.0;
  32. }
  33. // Normalize the input lighting vectors
  34. vec4 light0_ambient = vec4(0.2, 0.2, 0.2, 1.0);
  35. vec4 light0_diffuse = vec4(1.0, 1.0, 1.0, 1.0);
  36. vec4 light0_specular = vec4(1.0, 1.0, 1.0, 1.0);
  37. vec4 ambient_product0 = light0_ambient * material_ambient;
  38. vec4 diffuse_product0 = light0_diffuse * material_diffuse;
  39. vec4 specular_product0 = light0_specular * material_specular;
  40. vec3 N0 = normalize(fN0);
  41. vec3 E0 = normalize(fE0);
  42. vec3 L0 = normalize(fL0);
  43. vec3 H0 = normalize(L0 + E0);
  44. vec4 ambient0 = ambient_product0;
  45. float Kd0 = max(dot(L0, N0), 0.0);
  46. vec4 diffuse0 = Kd0 * diffuse_product0;
  47. float Ks0 = pow(max(dot(N0, H0), 0.0), material_shininess);
  48. vec4 specular0 = Ks0 * specular_product0;
  49. // discard the specular highlight if the light's behind the vertex
  50. if (dot(L0, N0) < 0.0) {
  51. specular0 = vec4(0.0, 0.0, 0.0, 1.0);
  52. }
  53. vec4 light1_ambient = vec4(0.2, 0.2, 0.2, 1.0);
  54. vec4 light1_diffuse = vec4(1.0, 1.0, 1.0, 1.0);
  55. vec4 light1_specular = vec4(1.0, 1.0, 1.0, 1.0);
  56. vec4 ambient_product1 = light1_ambient * material_ambient;
  57. vec4 diffuse_product1 = light1_diffuse * material_diffuse;
  58. vec4 specular_product1 = light1_specular * material_specular;
  59. vec3 N1 = normalize(fN1);
  60. vec3 E1 = normalize(fE1);
  61. vec3 L1 = normalize(fL1);
  62. vec3 H1 = normalize(L1 + E1);
  63. vec4 ambient1 = ambient_product0;
  64. float Kd1 = max(dot(L1, N1), 0.0);
  65. vec4 diffuse1 = Kd1 * diffuse_product1;
  66. float Ks1 = pow(max(dot(N1, H1), 0.0), material_shininess);
  67. vec4 specular1 = Ks1 * specular_product0;
  68. // discard the specular highlight if the light's behind the vertex
  69. if (dot(L1, N1) < 0.0) {
  70. specular1 = vec4(0.0, 0.0, 0.0, 1.0);
  71. }
  72. fColor = 0.5 * (plane_light_on * (ambient0 + diffuse0 + specular0) +
  73. (ambient1 + diffuse1 + specular1));
  74. fColor.a = 1.0;
  75. // fog
  76. vec4 fogColor = vec4(0.5, 0.5, 0.5, 1);
  77. fColor = fColor * fog_factor + fogColor * (1 - fog_factor);
  78. }