float4 objPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)); float4 _Outline_Sampler_var = SAMPLE_TEXTURE2D_LOD(_OutlineWidthMap, sampler_OutlineWidthMap, TRANSFORM_TEX(inputMesh.uv0, _BaseColorMap), 0.0); //v.2.0.4.3 baked Normal Texture for Outline float3 normalDir = UnityObjectToWorldNormal(inputMesh.normalOS); float3 tangentDir = normalize(mul(unity_ObjectToWorld, float4(inputMesh.tangentOS.xyz, 0.0)).xyz); float3 bitangentDir = normalize(cross(normalDir, tangentDir) * inputMesh.tangentOS.w); float3x3 tangentTransform = float3x3(tangentDir, bitangentDir, normalDir); //end float outlineWidth = (_OutlineWidth * 0.01 * smoothstep(_OutlineFadeOut, _OutlineFadeIn, distance(objPos.rgb, _WorldSpaceCameraPos)) * _Outline_Sampler_var.rgb).r; //v.2.0.7.5 float4 _ClipCameraPos = mul(UNITY_MATRIX_VP, float4(_WorldSpaceCameraPos.xyz, 1)); float3 bakedNormal = float3(inputMesh.uv1, 0); bakedNormal.z = sqrt(1.0 - saturate(dot(bakedNormal.xy, bakedNormal.xy))); float3 normalOS = lerp(inputMesh.normalOS, mul(bakedNormal, tangentTransform), _UseSmoothedNormal); float3 normal = mul((float3x3)transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)), normalOS); // screen space width float2 extendDir = normalize(TransformWViewToHClip(normal).xy); float4 clipPos = UnityObjectToClipPos(inputMesh.positionOS); clipPos.xy += extendDir * min(_Outline_MaxWidth, (clipPos.w * outlineWidth)); //clipPos.z = clipPos.z + _Offset_Z * _ClipCameraPos.z; float4 rws = mul(UNITY_MATRIX_I_P, clipPos); // use UNITY_MATRIX_I_P instead of unity_CameraInvProjection. rws = mul(UNITY_MATRIX_I_V, rws); // use UNITY_MATRIX_I_V instead of unity_cameraToWorld. varyingsType.vmesh.positionCS = clipPos; varyingsType.vmesh.positionRWS = rws.xyz;