// // OvrAvatar PC single component shader // // This is a Unity Surface shader implementation for our 1.5 skin shaded avatar look. // The benefit of using this version is that it uses the full Unity PBR lighting under the hood. // The Mobile shader is strongly recommended for use on mobile platforms for performance. // // Notes: // - Use Mobile shader if you need mouth vertex movement. Shader "OvrAvatar/Avatar_PC_SingleComponent" { Properties { [NoScaleOffset] _MainTex("Color (RGB)", 2D) = "white" {} [NoScaleOffset] _NormalMap("Normal Map", 2D) = "bump" {} [NoScaleOffset] _RoughnessMap("Roughness Map", 2D) = "black" {} _BaseColor("Color Tint", Color) = (0.95,0.77,0.63) _Dimmer("Dimmer", Range(0.0,1.0)) = 1.0 _Alpha("Alpha", Range(0.0,1.0)) = 1.0 _DiffuseIntensity("Diffuse Intensity", Range(0.0,1.0)) = 0.3 _RimIntensity("Rim Intensity", Range(0.0,10.0)) = 5.0 } SubShader { Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" } LOD 100 Blend SrcAlpha OneMinusSrcAlpha // Render the back facing parts of the object then set on backface culling. // This fixes broken faces with convex meshes when using the alpha path. Pass { Color(0,0,0,0) } CGPROGRAM #pragma surface surf Standard alpha:fade #pragma target 3.0 #pragma fragmentoption ARB_precision_hint_fastest // Set this shader keyword if you are using Linear color space #pragma multi_compile COLORSPACE_LINEAR_OFF COLORSPACE_LINEAR_ON // (Optional) Set this shader keyword if your scene only has one light #pragma multi_compile SINGLE_LIGHT_OFF SINGLE_LIGHT_ON #include "UnityCG.cginc" sampler2D _MainTex; sampler2D _NormalMap; sampler2D _RoughnessMap; float4 _BaseColor; float _Dimmer; float _Alpha; float _DiffuseIntensity; float _RimIntensity; struct Input { float2 uv_MainTex; float2 uv_NormalMap; float2 uv_RoughnessMap; float3 viewDir; float3 worldNormal; INTERNAL_DATA }; void surf(Input IN, inout SurfaceOutputStandard o) { // Unpack normal map o.Normal = tex2D(_NormalMap, IN.uv_NormalMap) * 2 - 1; // Diffuse texture sample float4 col = tex2D(_MainTex, IN.uv_MainTex); // Convert _BaseColor to gamma color space if we are in linear // Albedo texture is already in correct color space #if !defined(UNITY_COLORSPACE_GAMMA) _BaseColor.rgb = LinearToGammaSpace(_BaseColor.rgb); #endif // Adjust color tint with NdotL float NdotL = saturate(dot(WorldNormalVector(IN, o.Normal), _WorldSpaceLightPos0.xyz)); _BaseColor.rgb += _DiffuseIntensity * NdotL; // Multiply in color tint o.Albedo = col.rgb * _BaseColor; // Rim term float VdotN = saturate(dot(normalize(IN.viewDir), o.Normal)); o.Albedo += pow(1.0 - VdotN, _RimIntensity) * NdotL * _LightColor0; // Sample roughness map and set smoothness and metallic float4 roughnessSample = tex2D(_RoughnessMap, IN.uv_RoughnessMap); o.Smoothness = roughnessSample.a; o.Metallic = roughnessSample.r; // Global dimmer o.Albedo *= _Dimmer; // Global alpha o.Alpha = col.a * _Alpha; // Convert back to linear color space if we are in linear #if !defined(UNITY_COLORSPACE_GAMMA) o.Albedo = GammaToLinearSpace(o.Albedo); #endif } ENDCG } }