pbrLightingFunctions.fx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Light Results
  2. struct lightingInfo
  3. {
  4. vec3 diffuse;
  5. #ifdef SPECULARTERM
  6. vec3 specular;
  7. #endif
  8. #ifdef CLEARCOAT
  9. // xyz contains the clearcoat color.
  10. // w contains the 1 - clearcoat fresnel to ease the energy conservation computation.
  11. vec4 clearCoat;
  12. #endif
  13. #ifdef SHEEN
  14. vec3 sheen;
  15. #endif
  16. };
  17. vec3 computeHemisphericDiffuseLighting(preLightingInfo info, vec3 lightColor, vec3 groundColor) {
  18. return mix(groundColor, lightColor, info.NdotL);
  19. }
  20. vec3 computeDiffuseLighting(preLightingInfo info, vec3 lightColor) {
  21. float diffuseTerm = computeDiffuseTerm(info.NdotL, info.NdotV, info.VdotH, info.roughness);
  22. return diffuseTerm * info.attenuation * info.NdotL * lightColor;
  23. }
  24. vec3 computeSpecularLighting(preLightingInfo info, vec3 N, vec3 reflectance0, vec3 reflectance90, float geometricRoughnessFactor, vec3 lightColor) {
  25. float NdotH = clamp(dot(N, info.H), 0.000000000001, 1.0);
  26. vec3 specTerm = computeSpecularTerm(NdotH, info.NdotL, info.NdotV, info.VdotH, info.roughness, reflectance0, reflectance90, geometricRoughnessFactor);
  27. return specTerm * info.attenuation * info.NdotL * lightColor;
  28. }
  29. #ifdef ANISOTROPIC
  30. vec3 computeAnisotropicSpecularLighting(preLightingInfo info, vec3 V, vec3 N, vec3 T, vec3 B, float anisotropy, vec3 reflectance0, vec3 reflectance90, float geometricRoughnessFactor, vec3 lightColor) {
  31. float NdotH = clamp(dot(N, info.H), 0.000000000001, 1.0);
  32. float TdotH = dot(T, info.H);
  33. float BdotH = dot(B, info.H);
  34. float TdotV = dot(T, V);
  35. float BdotV = dot(B, V);
  36. float TdotL = dot(T, info.L);
  37. float BdotL = dot(B, info.L);
  38. vec3 specTerm = computeAnisotropicSpecularTerm(NdotH, info.NdotL, info.NdotV, info.VdotH, TdotH, BdotH, TdotV, BdotV, TdotL, BdotL, info.roughness, anisotropy, reflectance0, reflectance90, geometricRoughnessFactor);
  39. return specTerm * info.attenuation * info.NdotL * lightColor;
  40. }
  41. #endif
  42. #ifdef CLEARCOAT
  43. vec4 computeClearCoatLighting(preLightingInfo info, vec3 Ncc, float geometricRoughnessFactor, float clearCoatIntensity, vec3 lightColor) {
  44. float NccdotL = clamp(dot(Ncc, info.L), 0.00000000001, 1.0);
  45. float NccdotH = clamp(dot(Ncc, info.H), 0.000000000001, 1.0);
  46. vec2 clearCoatTerm = computeClearCoatTerm(NccdotH, info.VdotH, info.roughness, geometricRoughnessFactor, clearCoatIntensity);
  47. vec4 result = vec4(0.);
  48. result.rgb = clearCoatTerm.x * info.attenuation * NccdotL * lightColor;
  49. result.a = clearCoatTerm.y;
  50. return result;
  51. }
  52. vec3 computeClearCoatLightingAbsorption(float NdotVRefract, vec3 L, vec3 Ncc, vec3 clearCoatColor, float clearCoatThickness, float clearCoatIntensity) {
  53. vec3 LRefract = -refract(L, Ncc, vClearCoatRefractionParams.y);
  54. float NdotLRefract = clamp(dot(Ncc, LRefract), 0.00000000001, 1.0);
  55. vec3 absorption = computeClearCoatAbsorption(NdotVRefract, NdotLRefract, clearCoatColor, clearCoatThickness, clearCoatIntensity);
  56. return absorption;
  57. }
  58. #endif
  59. #ifdef SHEEN
  60. vec3 computeSheenLighting(preLightingInfo info, vec3 N, vec3 reflectance0, vec3 reflectance90, float geometricRoughnessFactor, vec3 lightColor) {
  61. float NdotH = clamp(dot(N, info.H), 0.000000000001, 1.0);
  62. vec3 specTerm = computeSheenTerm(NdotH, info.NdotL, info.NdotV, info.VdotH, info.roughness, reflectance0, reflectance90, geometricRoughnessFactor);
  63. return specTerm * info.attenuation * info.NdotL * lightColor;
  64. }
  65. #endif
  66. vec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler, mat4 textureProjectionMatrix){
  67. vec4 strq = textureProjectionMatrix * vec4(vPositionW, 1.0);
  68. strq /= strq.w;
  69. vec3 textureColor = texture2D(projectionLightSampler, strq.xy).rgb;
  70. return toLinearSpace(textureColor);
  71. }