light.glsl 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef _LIGHT_GLSL_
  2. #define _LIGHT_GLSL_
  3. #include "../std/brdf.glsl"
  4. #include "../std/math.glsl"
  5. #ifdef _VoxelAOvar
  6. #include "../std/conetrace.glsl"
  7. #endif
  8. #include "../std/ltc.glsl"
  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
  17. #ifdef _VoxelAOvar
  18. #ifdef _VoxelShadow
  19. , sampler3D voxels, vec3 voxpos
  20. #endif
  21. #endif
  22. , float occ
  23. ) {
  24. vec3 ld = lp - p;
  25. vec3 l = normalize(ld);
  26. vec3 h = normalize(v + l);
  27. float dotNH = dot(n, h);
  28. float dotVH = dot(v, h);
  29. float dotNL = dot(n, l);
  30. float theta = acos(dotNV);
  31. vec2 tuv = vec2(rough, theta / (0.5 * PI));
  32. tuv = tuv * LUT_SCALE + LUT_BIAS;
  33. vec4 t = textureLod(sltcMat, tuv, 0.0);
  34. mat3 invM = mat3(
  35. vec3(1.0, 0.0, t.y),
  36. vec3(0.0, t.z, 0.0),
  37. vec3(t.w, 0.0, t.x));
  38. float ltcspec = ltcEvaluate(n, v, dotNV, p, invM, lightArea0, lightArea1, lightArea2, lightArea3);
  39. ltcspec *= textureLod(sltcMag, tuv, 0.0).a;
  40. float ltcdiff = ltcEvaluate(n, v, dotNV, p, mat3(1.0), lightArea0, lightArea1, lightArea2, lightArea3);
  41. vec3 direct = albedo * ltcdiff + ltcspec * 0.05;
  42. direct *= attenuate(distance(p, lp));
  43. direct *= lightCol;
  44. direct *= dotNL + 2.0 * occ * occ - 1.0;
  45. #ifdef _VoxelAOvar
  46. #ifdef _VoxelShadow
  47. direct *= 1.0 - traceShadow(voxels, voxpos, l);
  48. #endif
  49. #endif
  50. return direct;
  51. }
  52. #endif