0506 쉐이더 Rim Light + Hologram
2021. 5. 6. 15:17ㆍunity/쉐이더
역광 Rim Light
프레넬 공식을 이용해서 빛의 반사율을 계산한다.
Shader "Custom/test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpMap("Normal", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal=UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = 0;
float rim = dot(o.Normal, IN.viewDir);
o.Albedo = pow(1 - rim, 5);
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = 0;
float ndotv = saturate(dot(o.Normal, IN.viewDir));
o.Emission = pow(1-ndotv, _RimPower) * _RimColor.rgb;
o.Alpha = c.a;
}
ENDCG
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert noambient
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPower;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float2 uv_BumpMap;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = c.rgb;
float ndotv = dot(o.Normal, IN.viewDir); //saturate(dot(o.Normal, IN.viewDir));
o.Emission = pow(1-ndotv, _RimPower) * _RimColor.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Holo"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPower("Rim Power",Range(1,10)) = 1
_HoloColor("Holo Color",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float _RimPower;
float4 _HoloColor;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = 0;
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPower);
o.Emission = rim*_HoloColor;
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
렌더 타입을 Transparent로, 옵션은 alpha : fade로 설정
알파에다 rim 값을 넣어주면 된다.
Shader "Custom/Holo"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPower("Rim Power",Range(1,10)) = 1
_Power("Power",Range(10,100)) = 10
}
SubShader
{
//Tags { "RenderType"="Transparent" "Queue"="Transparent"}
Tags { "RenderType" = "Opaque"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float _RimPower;
float _Power;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPower);
o.Emission =pow(frac(IN.worldPos.g*5),_Power);
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = float3(0, 1, 0);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPower);
o.Emission = pow(frac(IN.worldPos.g * _Interval- _Time.y), 10);
o.Alpha = rim;
}
ENDCG
Shader "Custom/Holo"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPower("Rim Power",Range(1,10)) = 1
_Power("Power",Range(10,100)) = 10
_Speed("Speed",Range(1,10)) = 1
_Interval ("Interval",Range(1,10))=1
}
SubShader
{
//Tags { "RenderType"="Transparent" "Queue"="Transparent"}
Tags { "RenderType" = "Opaque"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float _RimPower;
float _Power;
float _Speed;
float _Interval;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Emission = float3(0, 1, 0);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPower)
+ pow(frac(IN.worldPos.g * _Interval - (_Time.y * _Speed)), _Power);
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
'unity > 쉐이더' 카테고리의 다른 글
0507 쉐이더 툰 그래픽 만들기 (0) | 2021.05.07 |
---|---|
0506 쉐이더 블린퐁 (0) | 2021.05.06 |
0506 쉐이더 라이트닝 연산 (0) | 2021.05.06 |
0504 쉐이더 커스텀 라이트 Lambert, BlinnPhong, Standard (0) | 2021.05.04 |
0504 쉐이더 특정 부분만 반짝거리게 하기 (0) | 2021.05.04 |