TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Shader / URP > 뷰 벡터와 노멀 내적을 활용한 프레넬(Fresnel) 림라이트 HLSL 셰이더
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. 프레넬 림라이트 서브패스 구현

RimLightFresnel.hlsl
// 프래그먼트 셰이더 내부 림라이트 연산 로직
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;

참고자료 & 관련 링크