Added UtsEvaluateBSDF_MatCapDiffuse;
Added UtsEvaluateBSDF_MatCapSpecular;
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
#ifndef UCTS_HDRP_INCLUDED
|
||||
#define UCTS_HDRP_INCLUDED
|
||||
|
||||
#define UCTS_HDRP 1
|
||||
#include "Packages/com.misaki.hdrp-toon/Runtime/HDRP/Shaders/Includes/Common/UtsCommon.hlsl"
|
||||
|
||||
#define UTS_LAYER_VISIBILITY
|
||||
|
||||
@@ -201,19 +201,26 @@ UtsBSDFData ConvertUTSSurfaceDataToUTSBSDFData(UTSSurfaceData surfaceData)
|
||||
UtsBSDFData output;
|
||||
|
||||
output.materialFeatures = surfaceData.materialFeatures;
|
||||
|
||||
output.diffuseColor = UtsComputeDiffuseColor(surfaceData.baseColor, surfaceData.metallic, 0.05);
|
||||
output.firstShadingDiffuseColor = UtsComputeDiffuseColor(surfaceData.firstShadingColor, surfaceData.metallic, 0.05);
|
||||
output.secondShadingDiffuseColor = UtsComputeDiffuseColor(surfaceData.secondShadingColor, surfaceData.metallic, 0.05);
|
||||
|
||||
float albedoIntensity = max(0.1, (1 - sqrt(surfaceData.metallic)) * (1.7 - 0.7 * (1 - sqrt(surfaceData.metallic))));
|
||||
output.diffuseColor = albedoIntensity * surfaceData.baseColor;
|
||||
output.firstShadingDiffuseColor = albedoIntensity * surfaceData.firstShadingColor;
|
||||
output.secondShadingDiffuseColor = albedoIntensity * surfaceData.secondShadingColor;
|
||||
|
||||
output.fresnel0 = ComputeFresnel0(surfaceData.baseColor, surfaceData.metallic,0.22);
|
||||
#if _PBR_MODE_OFF
|
||||
output.fresnel0 = surfaceData.baseColor;
|
||||
#else
|
||||
output.fresnel0 = ComputeFresnel0(surfaceData.baseColor, surfaceData.metallic, 0.22);
|
||||
#endif
|
||||
output.fresnel90 = ComputeF90(output.fresnel0);
|
||||
output.reflectivity = (1.0 - 0.22) * (1 - surfaceData.metallic);
|
||||
|
||||
output.ambientOcclusion = surfaceData.ambientOcclusion;
|
||||
output.specularOcclusion = surfaceData.specularOcclusion;
|
||||
#if _PBR_MODE_OFF
|
||||
output.perceptualRoughness = 0.0;
|
||||
#else
|
||||
output.perceptualRoughness = PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness);
|
||||
#endif
|
||||
|
||||
output.subsurfaceColor = surfaceData.subsurfaceColor * surfaceData.subsurfaceMask;
|
||||
|
||||
@@ -242,10 +249,12 @@ PreLightData GetPreLightData_UTS(float3 V, PositionInputs posInput, inout UtsBSD
|
||||
|
||||
// Handle IBL + area light + multiscattering.
|
||||
// Note: use the not modified by anisotropy iblPerceptualRoughness here.
|
||||
float specularReflectivity;
|
||||
GetPreIntegratedFGDGGXAndDisneyDiffuse(clampedNdotV, preLightData.iblPerceptualRoughness, bsdfData.fresnel0, bsdfData.fresnel90, preLightData.specularFGD, preLightData.diffuseFGD, specularReflectivity);
|
||||
#ifdef USE_DIFFUSE_LAMBERT_BRDF
|
||||
float specularReflectivity = 1.0;
|
||||
#if _PBR_MODE_OFF
|
||||
preLightData.diffuseFGD = 1.0;
|
||||
preLightData.specularFGD = 1.0;
|
||||
#else
|
||||
GetPreIntegratedFGDGGXAndDisneyDiffuse(clampedNdotV, preLightData.iblPerceptualRoughness, bsdfData.fresnel0, bsdfData.fresnel90, preLightData.specularFGD, preLightData.diffuseFGD, specularReflectivity);
|
||||
#endif
|
||||
|
||||
#ifdef LIT_USE_GGX_ENERGY_COMPENSATION
|
||||
@@ -262,23 +271,18 @@ PreLightData GetPreLightData_UTS(float3 V, PositionInputs posInput, inout UtsBSD
|
||||
|
||||
float3 iblN;
|
||||
|
||||
// We avoid divergent evaluation of the GGX, as that nearly doubles the cost.
|
||||
// If the tile has anisotropy, all the pixels within the tile are evaluated as anisotropic.
|
||||
if (HasFlag(bsdfData.materialFeatures, MATERIALFEATUREFLAGS_LIT_ANISOTROPY))
|
||||
{
|
||||
float TdotV = dot(bsdfData.tangentWS, V);
|
||||
float BdotV = dot(bsdfData.bitangentWS, V);
|
||||
#if _PBR_MODE_ANISOTROPY
|
||||
float TdotV = dot(bsdfData.tangentWS, V);
|
||||
float BdotV = dot(bsdfData.bitangentWS, V);
|
||||
|
||||
preLightData.partLambdaV = GetSmithJointGGXAnisoPartLambdaV(TdotV, BdotV, clampedNdotV, bsdfData.roughnessT, bsdfData.roughnessB);
|
||||
preLightData.partLambdaV = GetSmithJointGGXAnisoPartLambdaV(TdotV, BdotV, clampedNdotV, bsdfData.roughnessT, bsdfData.roughnessB);
|
||||
|
||||
// perceptualRoughness is use as input and output here
|
||||
GetGGXAnisotropicModifiedNormalAndRoughness(bsdfData.bitangentWS, bsdfData.tangentWS, N, V, bsdfData.anisotropy, preLightData.iblPerceptualRoughness, iblN, preLightData.iblPerceptualRoughness);
|
||||
}
|
||||
else
|
||||
{
|
||||
preLightData.partLambdaV = GetSmithJointGGXPartLambdaV(clampedNdotV, bsdfData.roughnessT);
|
||||
iblN = N;
|
||||
}
|
||||
// perceptualRoughness is use as input and output here
|
||||
GetGGXAnisotropicModifiedNormalAndRoughness(bsdfData.bitangentWS, bsdfData.tangentWS, N, V, bsdfData.anisotropy, preLightData.iblPerceptualRoughness, iblN, preLightData.iblPerceptualRoughness);
|
||||
#else
|
||||
preLightData.partLambdaV = GetSmithJointGGXPartLambdaV(clampedNdotV, bsdfData.roughnessT);
|
||||
iblN = N;
|
||||
#endif
|
||||
|
||||
preLightData.iblR = reflect(-V, iblN);
|
||||
|
||||
@@ -305,22 +309,9 @@ PreLightData GetPreLightData_UTS(float3 V, PositionInputs posInput, inout UtsBSD
|
||||
preLightData.ltcTransformCoat = SampleLtcMatrix(CLEAR_COAT_PERCEPTUAL_ROUGHNESS, clampedNdotV, LTCLIGHTINGMODEL_GGX);
|
||||
}
|
||||
|
||||
// refraction (forward only)
|
||||
#if HAS_REFRACTION
|
||||
RefractionModelResult refraction = REFRACTION_MODEL(V, posInput, bsdfData);
|
||||
preLightData.transparentRefractV = refraction.rayWS;
|
||||
preLightData.transparentPositionWS = refraction.positionWS;
|
||||
preLightData.transparentTransmittance = exp(-bsdfData.absorptionCoefficient * refraction.dist);
|
||||
|
||||
// Empirical remap to try to match a bit the refraction probe blurring for the fallback
|
||||
// Use IblPerceptualRoughness so we can handle approx of clear coat.
|
||||
preLightData.transparentSSMipLevel = PositivePow(preLightData.iblPerceptualRoughness, 1.3) * uint(max(_ColorPyramidLodCount - 1, 0));
|
||||
#endif
|
||||
|
||||
return preLightData;
|
||||
}
|
||||
|
||||
|
||||
// Legacy for compatibility with existing shaders
|
||||
inline bool IsGammaSpace()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user