쉐이더 LimLight
다양하게 사용되는 라이팅 기법 중 하나로, 역광기법이라고 할 수 있다.
찍으려는 물체의 맞은 편의 역광이 비추면 피사체가 어둡게 보이는데, 이때 외곽선이 두드러지게 보이게 된다. LimLight를 이용하면 후광 효과 및 다양한 효과를 만들어낼 수 있다.
실습
viewDir 를 Input에 넣으면 카메라 방향 정보를 받아올 수 있다.
법선 벡터와 카메라 방향을 내적한 값을 Emission에 넣으면 카메라 방향으로 빛을 쏜 듯한 효과를 낼 수 있다.
그 값을 1에서 뺀 값을 넣으면 역광 효과를 낼 수 있다.
역광을 이용한 후광 효과 (스탠다드, 커스텀, 커스텀 블린)
Shader "Apply/CustomBinnPhong"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpTex("Normal Map", 2D) = "bump" {}
_LimColor("Lim Color", Color) = (1, 1, 1, 1)
_LimPow("Lim Intensity", Range(1, 10)) = 3
_SpecularColor("Specular Color", Color) = (1, 1, 1, 1)
_Specular("Specular", Range(1, 10)) = 3
_Gloss("Gloss", Range(1, 10)) = 3
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf CustomBlinnPhong noambient
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
float2 uv_BumpTex;
};
sampler2D _MainTex;
sampler2D _BumpTex;
fixed4 _LimColor;
float _LimPow;
float _Specular;
fixed4 _SpecularColor;
fixed _Gloss;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 mainTex = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = mainTex.rgb;
o.Alpha = mainTex.a;
fixed3 bumpTex = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));
o.Normal = bumpTex.rgb;
o.Gloss = _Gloss;
}
float4 LightingCustomBlinnPhong(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
{
//Lambert
float fNDotL = saturate(dot(s.Normal, lightDir)) * 0.5 +0.5;
// Disffuse
float3 diffColor;
diffColor = s.Albedo * fNDotL * _LightColor0.rgb * atten;
// Specular
float3 halfVector = normalize(viewDir + lightDir); //하프 벡터
float specular = saturate(dot(s.Normal, halfVector)); // 스펙큘라 (그레이 스케일)
specular = pow(specular, _Specular);
float3 specularColor = specular * _LightColor0.rgb * _SpecularColor.rgb * s.Gloss;
// Lim
float lim = pow(1 - dot(s.Normal, viewDir), _LimPow);
float3 limColor = _LimColor.rgb * lim;
float4 result;
result.rgb = diffColor + specularColor + limColor;
result.a = s.Alpha;
return result;
}
ENDCG
}
FallBack "Diffuse"
}
Lim을 이용한 홀로그램 효과
Shader "Apply/CustomHoloShader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpTex("Normal Map", 2D) = "bump" {}
_LimColor("LimLightColor", Color) = (1, 1, 1, 1)
_LimPow("LimLight Intencity", Range(1, 10)) = 3
_SpecularColor("Specular Color", Color) = (1, 1, 1, 1)
_Specular("Specular", Range(1, 10)) = 3
_Gloss("Gloss", Range(1, 10)) = 3
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent"}
LOD 200
CGPROGRAM
#pragma surface surf CustomHolo alpha:fade
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
float2 uv_BumpTex;
};
sampler2D _MainTex;
sampler2D _BumpTex;
fixed4 _LimColor;
float _LimPow;
float _Specular;
fixed4 _SpecularColor;
fixed _Gloss;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = mainTex.rgb;
o.Alpha = mainTex.a;
fixed3 bumpTex = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));
o.Normal = bumpTex.rgb;
o.Gloss = _Gloss;
}
float4 LightingCustomHolo(SurfaceOutput s, float lightDir, float viewDir, float atten)
{
// Lambert
float nDotL = dot(s.Normal, lightDir);
// Diffuse
float3 diffColor;
diffColor = s.Albedo * nDotL * _LightColor0.rgb * atten;
// Specular
float3 halfVector = normalize(viewDir + lightDir); //하프 벡터
float specular = saturate(dot(s.Normal, halfVector)); // 스펙큘라 (그레이 스케일)
specular = pow(specular, _Specular);
float3 specularColor = specular * _LightColor0.rgb * _SpecularColor.rgb * s.Gloss;
// Lim
float lim = 1 - dot(s.Normal, viewDir);
float3 limColor = pow(lim, _LimPow);
// result
float4 result;
result.rgb = saturate(diffColor + specularColor + limColor);
result.a = lim;
return result;
}
ENDCG
}
FallBack "Diffuse"
}