123456789101112131415161718192021222324252627282930313233343536373839404142 |
- struct LayaGI
- {
- half3 diffuse;
- half3 specular;
- };
- half4 BRDF1_Laya_PBS (half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, half3 normal, half3 viewDir, half3 lightDir, LayaGI gi)
- {
- half perceptualRoughness = SmoothnessToPerceptualRoughness (smoothness);
- half3 halfDir = Unity_SafeNormalize (lightDir + viewDir);
- half nv = abs(dot(normal, viewDir));
- half nl = saturate(dot(normal, lightDir));
- half nh = saturate(dot (normal, halfDir));
- half lv = saturate(dot(lightDir, viewDir));
- half lh = saturate(dot(lightDir, halfDir));
- // Diffuse term
- half diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl;
- // Specular term
- half roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
-
- half V = SmithJointGGXVisibilityTerm (nl, nv, roughness);
- half D = GGXTerm (nh, roughness);
- half specularTerm = V * D * UNITY_PI;
- specularTerm = sqrt(max(1e-4h, specularTerm));
- specularTerm = max(0, specularTerm * nl);
- half surfaceReduction = 1.0 - 0.28 * roughness * perceptualRoughness;
- half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity));
- half3 color = diffColor * (gi.diffuse + _LightColor0 * diffuseTerm)
- + specularTerm * _LightColor0 * FresnelTerm(specColor, lh)
- + surfaceReduction * gi.specular * FresnelLerp(specColor, grazingTerm, nv);
-
- return half4(color, 1);
- }
|