light.glsl 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #ifndef _LIGHT_GLSL_
  2. #define _LIGHT_GLSL_
  3. #include "std/brdf.glsl"
  4. #include "std/math.glsl"
  5. #include "std/ltc.glsl"
  6. #ifdef _Voxel
  7. #include "std/conetrace.glsl"
  8. #endif
  9. uniform vec3 lightArea0;
  10. uniform vec3 lightArea1;
  11. uniform vec3 lightArea2;
  12. uniform vec3 lightArea3;
  13. uniform sampler2D sltcMat;
  14. uniform sampler2D sltcMag;
  15. vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol,
  16. const vec3 albedo, const float rough, const vec3 f0, const float occ
  17. #ifdef _Voxel
  18. , sampler3D voxels, vec3 voxpos
  19. #endif
  20. ) {
  21. vec3 ld = lp - p;
  22. vec3 l = normalize(ld);
  23. float dotNL = max(0.0, dot(n, l));
  24. float theta = acos(dotNV);
  25. vec2 tuv = vec2(rough, theta / (0.5 * PI));
  26. tuv = tuv * LUT_SCALE + LUT_BIAS;
  27. vec4 t = textureLod(sltcMat, tuv, 0.0);
  28. mat3 invM = mat3(
  29. vec3(1.0, 0.0, t.y),
  30. vec3(0.0, t.z, 0.0),
  31. vec3(t.w, 0.0, t.x));
  32. float ltcspec = ltcEvaluate(n, v, dotNV, p, invM, lightArea0, lightArea1, lightArea2, lightArea3);
  33. ltcspec *= textureLod(sltcMag, tuv, 0.0).a;
  34. float ltcdiff = ltcEvaluate(n, v, dotNV, p, mat3(1.0), lightArea0, lightArea1, lightArea2, lightArea3);
  35. vec3 direct = albedo * ltcdiff + ltcspec * 0.05;
  36. direct *= attenuate(distance(p, lp));
  37. direct *= lightCol;
  38. direct *= clamp(dotNL + 2.0 * occ * occ - 1.0, 0.0, 1.0); // Micro shadowing
  39. #ifdef _Voxel
  40. direct *= 1.0 - traceShadow(voxels, voxpos, l);
  41. #endif
  42. return direct;
  43. }
  44. #endif