|
|
|
|
|
|
detailMask = SAMPLE_UVMAPPING_TEXTURE2D(ADD_IDX(_MaskMap), SAMPLER_MASKMAP_IDX, ADD_IDX(layerTexCoord.base)).b; |
|
|
|
#endif |
|
|
|
float2 detailAlbedoAndSmoothness = SAMPLE_UVMAPPING_TEXTURE2D(ADD_IDX(_DetailMap), SAMPLER_DETAILMAP_IDX, ADD_IDX(layerTexCoord.details)).rb; |
|
|
|
float detailAlbedo = detailAlbedoAndSmoothness.r; |
|
|
|
float detailSmoothness = detailAlbedoAndSmoothness.g; |
|
|
|
float detailAlbedo = detailAlbedoAndSmoothness.r * 2.0 - 1.0; |
|
|
|
float detailSmoothness = detailAlbedoAndSmoothness.g * 2.0 - 1.0; |
|
|
|
// Resample the detail map but this time for the normal map. This call should be optimize by the compiler |
|
|
|
// We split both call due to trilinear mapping |
|
|
|
detailNormalTS = SAMPLE_UVMAPPING_NORMALMAP_AG(ADD_IDX(_DetailMap), SAMPLER_DETAILMAP_IDX, ADD_IDX(layerTexCoord.details), ADD_IDX(_DetailNormalScale)); |
|
|
|
|
|
|
#ifdef _DETAIL_MAP_IDX |
|
|
|
// Use overlay blend mode for detail abledo: (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))) |
|
|
|
float3 baseColorOverlay = (detailAlbedo < 0.5) ? |
|
|
|
surfaceData.baseColor * PositivePow(2.0 * detailAlbedo, ADD_IDX(_DetailAlbedoScale)) : |
|
|
|
1.0 - (1.0 - surfaceData.baseColor) * PositivePow(2.0 * (1.0 - detailAlbedo), ADD_IDX(_DetailAlbedoScale)); |
|
|
|
|
|
|
|
// Goal: we want the detail albedo map to be able to darken down to black and brighten up to white the surface albedo. |
|
|
|
// The scale control the speed of the gradient. We simply remap detailAlbedo from [0..1] to [-1..1] then perform a lerp to black or white |
|
|
|
// with a factor based on speed. |
|
|
|
// For base color we interpolate in sRGB space (approximate here as square) as it get a nicer perceptual gradient |
|
|
|
float albedoDetailSpeed = saturate(abs(detailAlbedo) * ADD_IDX(_DetailAlbedoScale)); |
|
|
|
float3 baseColorOverlay = lerp(sqrt(surfaceData.baseColor), (detailAlbedo < 0.0) ? float3(0.0, 0.0, 0.0) : float3(1.0, 1.0, 1.0), albedoDetailSpeed * albedoDetailSpeed); |
|
|
|
baseColorOverlay *= baseColorOverlay; |
|
|
|
// Lerp with details mask |
|
|
|
surfaceData.baseColor = lerp(surfaceData.baseColor, saturate(baseColorOverlay), detailMask); |
|
|
|
#endif |
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef _DETAIL_MAP_IDX |
|
|
|
// Use overlay blend mode for detail abledo: (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))) |
|
|
|
float smoothnessOverlay = (detailSmoothness < 0.5) ? |
|
|
|
surfaceData.perceptualSmoothness * PositivePow(2.0 * detailSmoothness, ADD_IDX(_DetailSmoothnessScale)) : |
|
|
|
1.0 - (1.0 - surfaceData.perceptualSmoothness) * PositivePow(2.0 * (1.0 - detailSmoothness), ADD_IDX(_DetailSmoothnessScale)); |
|
|
|
// See comment for baseColorOverlay |
|
|
|
float smoothnessDetailSpeed = saturate(abs(detailSmoothness) * ADD_IDX(_DetailSmoothnessScale)); |
|
|
|
float3 smoothnessOverlay = lerp(surfaceData.perceptualSmoothness, (detailSmoothness < 0.0) ? 0.0 : 1.0, smoothnessDetailSpeed); |
|
|
|
// Lerp with details mask |
|
|
|
surfaceData.perceptualSmoothness = lerp(surfaceData.perceptualSmoothness, saturate(smoothnessOverlay), detailMask); |
|
|
|
#endif |
|
|
|