lights_phong_pars_fragment.glsl 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. varying vec3 vViewPosition;
  2. #ifndef FLAT_SHADED
  3. varying vec3 vNormal;
  4. #endif
  5. struct BlinnPhongMaterial {
  6. vec3 diffuseColor;
  7. vec3 specularColor;
  8. float specularShininess;
  9. float specularStrength;
  10. };
  11. #if NUM_RECT_AREA_LIGHTS > 0
  12. void RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
  13. vec3 matDiffColor = material.diffuseColor;
  14. vec3 matSpecColor = material.specularColor;
  15. vec3 lightColor = rectAreaLight.color;
  16. float roughness = BlinnExponentToGGXRoughness( material.specularShininess );
  17. // Evaluate Lighting Equation
  18. vec3 spec = Rect_Area_Light_Specular_Reflectance(
  19. geometry,
  20. rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,
  21. roughness,
  22. ltcMat, ltcMag );
  23. vec3 diff = Rect_Area_Light_Diffuse_Reflectance(
  24. geometry,
  25. rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );
  26. // TODO (abelnation): note why division by 2PI is necessary
  27. reflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;
  28. reflectedLight.directDiffuse += lightColor * matDiffColor * diff / PI2;
  29. }
  30. #endif
  31. void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
  32. #ifdef TOON
  33. vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;
  34. #else
  35. float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
  36. vec3 irradiance = dotNL * directLight.color;
  37. #endif
  38. #ifndef PHYSICALLY_CORRECT_LIGHTS
  39. irradiance *= PI; // punctual light
  40. #endif
  41. reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
  42. reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;
  43. }
  44. void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
  45. reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
  46. }
  47. #define RE_Direct RE_Direct_BlinnPhong
  48. #define RE_Direct_RectArea RE_Direct_RectArea_BlinnPhong
  49. #define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong
  50. #define Material_LightProbeLOD( material ) (0)