#ifndef UTS_SURFACE_FEATURE_EVALUATION #define UTS_SURFACE_FEATURE_EVALUATION // Rim light is calculated per light float3 UtsEvaluateColor_RimLight(PositionInputs posInput, UtsBSDFData bsdfData, PreLightData preLightData, float3 L, float3 lightColor) { float clampNdotV = ClampNdotV(preLightData.NdotV); float rimLightWeight = 1.0 - clampNdotV; rimLightWeight = pow(rimLightWeight, exp2(lerp(3.0, 0.0, _RimLightLevel))); float3 normalVS = normalize(mul((float3x3)UNITY_MATRIX_V, bsdfData.geomNormalWS)); float2 depthUV = posInput.positionNDC.xy + normalVS * (_RimLightLevel * 0.05 / posInput.linearDepth); float offsetedDepth = SampleCameraDepth(depthUV); float depthDiff = saturate(posInput.deviceDepth - offsetedDepth); float halfLambert = 0.5 * dot(bsdfData.normalWS, L) + 0.5; //float rimLightMask = lerp(0.5 * lambert + 0.5, saturate(lambert), _Tweak_LightDirection_MaskLevel * 2.0); float rimLightMask = saturate(smoothstep(_Tweak_LightDirection_MaskLevel, 1.0, halfLambert)); rimLightWeight = step(0.0025 / posInput.linearDepth, depthDiff); float3 outColor = rimLightWeight * lightColor * _RimLightColor * _RimLightStrength; return outColor * rimLightMask; } DirectLighting UtsEvaluateAngelRing(FragInputs input, float3 normalWS, float3 V) { DirectLighting lighting; ZERO_INITIALIZE(DirectLighting, lighting); // Should we scroll the angel ring texture on x? float3 cameraRight = UNITY_MATRIX_V[0].xyz; float3 cameraFront = UNITY_MATRIX_V[2].xyz; float3 upVector = float3(0, 1, 0); float3 rightAxis = cross(cameraFront, upVector); float cameraRightMagnitude = sqrt(cameraRight.x * cameraRight.x + cameraRight.y * cameraRight.y + cameraRight.z * cameraRight.z); float rightAxisMagnitude = sqrt(rightAxis.x * rightAxis.x + rightAxis.y * rightAxis.y + rightAxis.z * rightAxis.z); float cameraRollCos = dot(rightAxis, cameraRight) / (rightAxisMagnitude * cameraRightMagnitude); float3 cameraRoll = acos(clamp(cameraRollCos, -1.0, 1.0)); float cameraDir = cameraRight.y < 0 ? -1.0 : 1.0; float2 arOffsetU = lerp(mul(UNITY_MATRIX_V, float4(normalWS, 0)).xyz, float3(0, 0, 1), _AngelRingOffsetU).xy; arOffsetU = arOffsetU * 0.5 + 0.5; float2 arvnRotate = RotateUV(arOffsetU, -(cameraDir * cameraRoll), 0.5, 1.0); float2 arOffsetUV = float2(arvnRotate.x, lerp(input.texCoord0.y, arvnRotate.y, _AngelRingOffsetV)); float4 angelRingColor = SAMPLE_TEXTURE2D(_AngelRingColorMap, sampler_AngelRingColorMap, TRANSFORM_TEX(arOffsetUV, _AngelRingColorMap)) * _AngelRingColor * _AngelRingIntensity; float weight = saturate(dot(normalize(V), normalWS)); lighting.specular += angelRingColor.r * angelRingColor.a * weight; return lighting; } #endif