게임 그래픽 프로그래밍
셰이더: 림 라이트
101won
2024. 9. 4. 22:30
Rim라이트: 역광이있을때털이나반투명재질
라이팅, 노멀, 카메라
Fresnel (프레넬, 반사공식) :배경과 캐릭터의 분리, 강조 등 특정 상태를 표현하기 위한 이펙트
N dot V : 뷰=카메라를 마주보고 바라보는 방향이 가장 밝음
// 림 라이트 : 프레넬 만들기 ndotv
float ndotv = dot(s.Normal, viewDir);
return pow(1-ndotv,5);
Shader "Custom/Fresnel"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimColor ("Rim Color", Color) = (1,1,1,1)
_RimPow ("Rim Power", Range(1, 10)) = 3
_BumpMap("NormalMap", 2D) = "bump" {} // 노말을 적용할 범프맵
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert// noambient!
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPow;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir; // 카메라로 본다
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
//normal map
fixed4 d = tex2D(_BumpMap, IN.uv_BumpMap);
float3 normal = UnpackNormal(d);
o.Normal = normal;
//림 라이트 : 배경과 구분, 상태 표시
// staturate(값):0보다 낮은 값은 0으로//1보다 높은 값은 1로 잘라준다
// 내적연산한값은1 ~ -1
float rim = saturate(dot(o.Normal, IN.viewDir));
o.Emission = pow(1 - rim, _RimPow) * _RimColor.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}