lighting-intermediate-data.chunk 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. struct LightingIntermediateData
  2. {
  3. vec3 N, H, L, V; // normalized
  4. float distToLight, distToLightSqr; // (pos->light)^2
  5. float distToCamera, distToCameraSqr; // pos->camera
  6. float angleAttenuation, distAttenuation;
  7. float NoL, NoV, NoH, VoH;
  8. float NoLSat, NoVSat, NoHSat;//, VoHSat; // clamped to 0-1
  9. float NoVAbsSat, VoHAbsSat; // abs and clamped to 1
  10. HIGHP_VALUE_STRUCT_DEFINE(vec3, worldPosition);
  11. // for advanced material
  12. vec3 T, B;
  13. // material data
  14. float specularParam; // roughness or specular power
  15. // todo: add F0 & F90
  16. float ior, layerOpacity;
  17. #if CC_SURFACES_LIGHTING_ANISOTROPIC
  18. float anisotropyShape;
  19. #endif
  20. #if CC_SURFACES_LIGHTING_TRANSMIT_DIFFUSE
  21. vec4 shadowPosAndDepth; //xy: shadowmap uv, z: camera depth from pixel LVP, w: camera depth from shadowmap, (z == w && z > 999998.0) means disable get distance from shadowmap
  22. vec4 transmitDiffuseParams; //zw: min/max DepthWS for shadowmap, x: transmit irradiance apply shadow, y: additional transmit mask, for shadowmap uncovered area
  23. #endif
  24. #if CC_SURFACES_LIGHTING_TRANSMIT_SPECULAR || CC_SURFACES_LIGHTING_TRANSMIT_DIFFUSE
  25. vec4 transmitScatteringParams; // xy: extinction coef for out/in-scattering, z: in-scattering coef, w: transmit distance(water depth, leaf thickness)
  26. vec3 outScatteringColor, inScatteringColor;
  27. #endif
  28. #if CC_SURFACES_LIGHTING_TT
  29. vec3 baseColorTT;
  30. float ttIntensity, ttScatterCoef;
  31. #endif
  32. };
  33. // add overrided functions for difference shading-models in <surfaces/module-functions/>
  34. void CCSurfacesLightingGetIntermediateData_PerPixel(inout LightingIntermediateData data, vec3 worldNormal, vec3 worldPos, vec3 worldTangent, vec3 worldBinormal
  35. #if CC_SURFACES_LIGHTING_ANISOTROPIC
  36. , float anisotropyShape
  37. #endif
  38. )
  39. {
  40. // N V
  41. data.N = worldNormal;
  42. data.V = cc_cameraPos.xyz - worldPos;
  43. data.distToCameraSqr = dot(data.V, data.V);
  44. data.distToCamera = sqrt(data.distToCameraSqr);
  45. data.V /= data.distToCamera;
  46. data.angleAttenuation = data.distAttenuation = 1.0;
  47. data.NoV = dot(data.N, data.V);
  48. data.NoVSat = max(data.NoV, 0.0);
  49. data.NoVAbsSat = max(abs(data.NoV), 0.0);
  50. HIGHP_VALUE_TO_STRUCT_DEFINED(worldPos, data.worldPosition);
  51. data.T = worldTangent;
  52. data.B = worldBinormal;
  53. #if CC_SURFACES_LIGHTING_ANISOTROPIC
  54. data.anisotropyShape = anisotropyShape;
  55. #endif
  56. #if CC_SURFACES_LIGHTING_TRANSMIT_SPECULAR || CC_SURFACES_LIGHTING_TRANSMIT_DIFFUSE
  57. data.outScatteringColor = vec3(1.0);
  58. data.inScatteringColor = vec3(0.0);
  59. data.transmitScatteringParams = vec4(0.0);
  60. #endif
  61. #if CC_SURFACES_LIGHTING_TRANSMIT_DIFFUSE
  62. data.shadowPosAndDepth = vec4(0.0, 0.0, SURFACES_MAX_TRANSMIT_DEPTH_VALUE, SURFACES_MAX_TRANSMIT_DEPTH_VALUE);
  63. #endif
  64. #if CC_SURFACES_LIGHTING_TT
  65. data.baseColorTT = vec3(0.0);
  66. data.ttIntensity = data.ttScatterCoef = 0.0;
  67. #endif
  68. }
  69. void CCSurfacesLightingGetIntermediateData_PerLight(inout LightingIntermediateData data, vec3 lightDirWithDist)
  70. {
  71. // L H
  72. data.L = lightDirWithDist;
  73. data.distToLightSqr = dot(data.L, data.L);
  74. data.distToLight = sqrt(data.distToLightSqr);
  75. data.L /= data.distToLight;
  76. data.H = normalize(data.L + data.V);
  77. // dot
  78. data.NoL = dot(data.N, data.L);
  79. data.NoH = dot(data.N, data.H);
  80. data.VoH = dot(data.V, data.H);
  81. data.NoLSat = max(data.NoL, 0.0);
  82. data.NoHSat = max(data.NoH, 0.0);
  83. // data.VoHSat = max(data.VoH, 0.0);
  84. data.VoHAbsSat = max(abs(data.VoH), 0.0);
  85. }