Shader / URP
Beginner
Unity 2021.3+ / Unity 6 (URP)
뷰 벡터와 노멀 내적을 활용한 프레넬(Fresnel) 림라이트 HLSL 셰이더
시선 방향(ViewDir)과 표면 노멀(Normal)의 각도 차이를 계산해 캐릭터 외곽선을 발광시키는 가볍고 세련된 프레넬 림라이트 구현.
#Shader #URP #HLSL #Fresnel #Lighting
핵심 개념프레넬 림라이트는 카메라 시선 벡터($V$)와 표면 법선 벡터($N$)의 내적값($V \cdot N$)을 이용합니다. 시선과 노멀이 수직에 가까울수록(표면 외곽선일수록) 내적값이 0에 수렴하므로,
1.0 - saturate(dot(V, N))을 취하고 거듭제곱(pow)을 하면 선명한 외곽 테두리 조명이 형성됩니다.1. 프레넬 림라이트 서브패스 구현
// 프래그먼트 셰이더 내부 림라이트 연산 로직
float3 viewDirWS = normalize(_WorldSpaceCameraPos - input.positionWS);
float3 normalWS = normalize(input.normalWS);
// 1. 프레넬 인자 계산
float NdotV = saturate(dot(normalWS, viewDirWS));
float rim = 1.0 - NdotV;
rim = pow(rim, _RimPower); // 거듭제곱으로 림의 폭과 예리함 조절
// 2. 최종 색상 합성
half3 rimColor = _RimColor.rgb * rim * _RimIntensity;
half3 finalColor = baseColor.rgb + rimColor;