LayaBRDF.cginc 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. struct LayaGI
  2. {
  3. half3 diffuse;
  4. half3 specular;
  5. };
  6. half4 BRDF1_Laya_PBS (half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, half3 normal, half3 viewDir, half3 lightDir, LayaGI gi)
  7. {
  8. half perceptualRoughness = SmoothnessToPerceptualRoughness (smoothness);
  9. half3 halfDir = Unity_SafeNormalize (lightDir + viewDir);
  10. half nv = abs(dot(normal, viewDir));
  11. half nl = saturate(dot(normal, lightDir));
  12. half nh = saturate(dot (normal, halfDir));
  13. half lv = saturate(dot(lightDir, viewDir));
  14. half lh = saturate(dot(lightDir, halfDir));
  15. // Diffuse term
  16. half diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl;
  17. // Specular term
  18. half roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
  19. half V = SmithJointGGXVisibilityTerm (nl, nv, roughness);
  20. half D = GGXTerm (nh, roughness);
  21. half specularTerm = V * D * UNITY_PI;
  22. specularTerm = sqrt(max(1e-4h, specularTerm));
  23. specularTerm = max(0, specularTerm * nl);
  24. half surfaceReduction = 1.0 - 0.28 * roughness * perceptualRoughness;
  25. half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity));
  26. half3 color = diffColor * (gi.diffuse + _LightColor0 * diffuseTerm)
  27. + specularTerm * _LightColor0 * FresnelTerm(specColor, lh)
  28. + surfaceReduction * gi.specular * FresnelLerp(specColor, grazingTerm, nv);
  29. return half4(color, 1);
  30. }