meteorgame/Assets/UnityChan/Art/UnityChanShader/Shader/CharaOutline.cg

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;
}