Shader/Shader - SurfaceShader

13-4 rim

소나무꼴 2020. 4. 6. 22:37
Shader "Custom/13-4"
{
    Properties
    {
        //_Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
		_BumpMap ("NormalMap (RGB)", 2D) = "white" {}
		_SpecCol ("Specular Color", Color) = (1,1,1,1)
		_SpecPow ("Specular Pow", Range(10, 200)) = 100
		_GlossTex("Gloss Tex", 2D) = "white"{}
		_GlossPow("Gloss Pow", Range(0, 1)) = 1
			//_Glossiness ("Smoothness", Range(0,1)) = 0.5
			//_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader
	{
		Tags { "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf _CustomLight noambient//Lambert Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0
		sampler2D _MainTex;
		sampler2D _BumpMap;
		sampler2D _GlossTex;
		float4 _SpecCol;
		float _SpecPow;
		float _GlossPow;

		struct Input
		{
			float2 uv_MainTex;
			float2 uv_BumpMap;
			float2 uv_GlossTex;
		};


		// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
		// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
		// #pragma instancing_options assumeuniformscaling
		UNITY_INSTANCING_BUFFER_START(Props)
			// put more per-instance properties here
		UNITY_INSTANCING_BUFFER_END(Props)


		void surf(Input IN, inout SurfaceOutput o)
		{
			fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
			fixed4 m = tex2D(_GlossTex, IN.uv_GlossTex);
			o.Albedo = c.rgb;
			o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
			o.Gloss = m.b;
			o.Alpha = c.a;
		}

		float4 Lighting_CustomLight(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
		{
			//Lambert term
			float3 diffColor;
			float ndotl = saturate(dot(s.Normal, -lightDir));
			diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;

			// spec term
			float3 H = normalize(-lightDir + -viewDir);
			float spec = saturate(dot(H, s.Normal));
			spec = pow(spec, _SpecPow);
			float3 specColor = spec * _SpecCol.rgb *(s.Gloss * _GlossPow);

			// rim term
			float rimColor;
			float rim = abs(dot(-viewDir, s.Normal));
			float invrim = 1 - rim;
			rimColor = pow(invrim, 6) * float3(0.5, 0.5, 0.5);

			//final term
			float4 final;
			final.rgb = diffColor.rgb + specColor + rimColor;
			final.a = s.Alpha;
			return final;
		}

		ENDCG
	}
FallBack "Diffuse"
}

'Shader > Shader - SurfaceShader' 카테고리의 다른 글

Custom/15-1-Reflection  (0) 2020.04.07
14-5  (0) 2020.04.06
13-3 Gloss  (0) 2020.04.05
13-2 스펙귤러  (0) 2020.04.05
12-2 Rim 라이트  (0) 2020.04.04