63 lines
1.6 KiB
Plaintext
63 lines
1.6 KiB
Plaintext
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
|
|
|
// Outline shader
|
|
|
|
// Material parameters
|
|
float4 _Color;
|
|
float4 _LightColor0;
|
|
float _EdgeThickness = 1.0;
|
|
float4 _MainTex_ST;
|
|
|
|
// Textures
|
|
sampler2D _MainTex;
|
|
|
|
// Structure from vertex shader to fragment shader
|
|
struct v2f
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
// Float types
|
|
#define float_t half
|
|
#define float2_t half2
|
|
#define float3_t half3
|
|
#define float4_t half4
|
|
|
|
// Outline thickness multiplier
|
|
#define INV_EDGE_THICKNESS_DIVISOR 0.00285
|
|
// Outline color parameters
|
|
#define SATURATION_FACTOR 0.6
|
|
#define BRIGHTNESS_FACTOR 0.8
|
|
|
|
// Vertex shader
|
|
v2f vert( appdata_base v )
|
|
{
|
|
v2f o;
|
|
o.uv = TRANSFORM_TEX( v.texcoord.xy, _MainTex );
|
|
|
|
half4 projSpacePos = UnityObjectToClipPos( v.vertex );
|
|
half4 projSpaceNormal = normalize( UnityObjectToClipPos( half4( v.normal, 0 ) ) );
|
|
half4 scaledNormal = _EdgeThickness * INV_EDGE_THICKNESS_DIVISOR * projSpaceNormal; // * projSpacePos.w;
|
|
|
|
scaledNormal.z += 0.00001;
|
|
o.pos = projSpacePos + scaledNormal;
|
|
|
|
return o;
|
|
}
|
|
|
|
// Fragment shader
|
|
float4 frag( v2f i ) : COLOR
|
|
{
|
|
float4_t diffuseMapColor = tex2D( _MainTex, i.uv );
|
|
|
|
float_t maxChan = max( max( diffuseMapColor.r, diffuseMapColor.g ), diffuseMapColor.b );
|
|
float4_t newMapColor = diffuseMapColor;
|
|
|
|
maxChan -= ( 1.0 / 255.0 );
|
|
float3_t lerpVals = saturate( ( newMapColor.rgb - float3( maxChan, maxChan, maxChan ) ) * 255.0 );
|
|
newMapColor.rgb = lerp( SATURATION_FACTOR * newMapColor.rgb, newMapColor.rgb, lerpVals );
|
|
|
|
return float4( BRIGHTNESS_FACTOR * newMapColor.rgb * diffuseMapColor.rgb, diffuseMapColor.a ) * _Color * _LightColor0;
|
|
}
|