[UE5] 프레넬을 활용한 현실감 있는 물 셰이더 만들기
시작하기
- 언리얼을 이용해서 프로젝트를 시작했는데 컨셉은 청소기를 통해 물체들을 빨아들이는 건데 그 중에서 물같은 유체도 포함된다.
- 팀원들에게 부탁하기에는 다들 바빠보여서 이번 기회에 공부할겸 한번 직접 제작해 볼까 한다.
Fresnel 프레넬 이란?
- 프레넬이란 모든 빛은 매질(media)에 따라 반사, 흡수, 굴절을 하게 되는데 이 프레넬 공식을 통해 빛의 움직을 계산한다.
- 이를 사용하면 물체의 가장자리 빛이 더 강하게 반사되는 현상을 표현할 수 있다.
골절률 (Refactive index)
- 빛이 특정 매질을 통과해서 이동할때 얼마나 느려지는지 비율을 측정한 것이다.
- 빛이 느려지면 이동 방향이 바뀌게 된다.
- 빛은 여러 파장이 합쳐서 보이게 되는데 이런 파장에 따라 골절률이 달라진다.
- 그렇기에 파장별로 골절률 계산을 해야한다.
스넬의 법칙(Snell’s law)
-
매질에 따라 빛이 꺾이는 것을 알 수 있는 공식이다.
- v 는 속도 (velocity)
- λ는 파장 (wavelength)
- n은 골절률 (IOR)
-
이런 관계를 설명한 것이 스넬의 법칙이다.
- 그래서 물과 기름이 만나면 아래처럼 파장이 변화한다.
매질이 반사할수도 있다.
- 굴절률이 다른 매질을 만나게되면 특정 각도에서 굴절이 아니라 완전히 반사하는 경우가 있다.
- Critical angle처럼 특정 각도를 넘어가면 전반사가 발생한다.
전반사 각도 구하기 공식
- 대기의 굴절률이 1이고 아크릴의 굴절률이 1.5면 전반사 각은 41.8이 된다.
프레넬 공식 (Fresnel equation)
- 그래픽스에서 반사와 굴절을 계산하기 위해서 반사되는 빛의 양과 얼마나 빛이 굴절되는지 알아야한다.
- 그 공식이 프레넬 공식인데 유도식은 너무 어려워서 패스
- 프레넬 공식은 스넬의 법칙, 반사 법칙 등을 이용해서 유도된다
- 일반적으로 컴퓨터 그래픽스에서는 Schlick’s approximation을 사용한다. 근사계산 공식이다.
- 모든 각도에서의 굴절률(IOR)을 알 수 없기 때문에 근사계산을 해야한다.
- 모든 각도에서의 굴절률(IOR)을 알 수 없기 때문에 근사계산을 해야한다.
그래프
- 프레넬 공식을 그래프와 시키면 다음과 같다.
- 가로축 : 시선과 노멀벡터의 각도
- 세로축 : 반사율
-
수평(90도)일 수록 높은 반사율을 보인다.
- 일반적으로 물체를 수직에서 바라본(0도) 반사율 값을 넣는 근사 계산식을 사용한다.
- R0값이 그래프에서의 0도의 반사율 값이라 보면된다.
-
대부분의 엔진에서는 F0이라고 표현한다(Fresnel at Degree 0 도 인듯 하다.)
- 아래는 대기속에 있다고 가정할때의 식이다.
- 물의 경우 1.33의 굴절률을 가진다.
- 일반적으로 이 F0 를 “Metallic” 핀에다가 넣어 주시면 된다
물 쉐이더 만들기
겉부분만 반사시키기
언리얼의 Fresnal 노드
- Fresnal 노드는 빛의 굴절률 공식이지만 림라이트나 실루엣을 만들때 많이 사용한다.
- 다만 이 노드는 Metalic으로 반영되는 Fresnel은 의미가 명확하지만 이건 그냥 효과이기 떄문이다.
- 이 노드는 사용하면 비물리적인 결과를 산출할 수 있어서 보통 Metalic을 제거하고 Emissive를 사용한다.
타일링 오프셋
타일링 오프셋 (Tiling Offset)
- 언리얼은 타일링 오프셋 노드가 따로 없다
- 그래서 직접 텍스처 좌표계나 월드 포지션을 통해 이동시켜야한다.
시간에 따른 노이즈 생성
- Absolute world Position
- 절대적인 월드 포지션
- 절대적인 월드 포지션
Noise Node
- Function으로 노이즈 종류를 변경할 수 있다.
- Output Value를 통해 흰색 검은색 부분 비율을 조절할 수 있다.
노이즈 조절하기
-
Multiply로 Destortion(파괴) 값을 조절해서 노이즈 값을 연하게 해준다.
-
Destortion 값이 1이면 노이즈가 눈에 보여서 줄이는 작업이 필요하다.
씬 컬러 적용
- 스크린 포지션에 노이즈를 입히고 그렇게 만들어진 UV에 화면 색깔을 입히면 물처럼 일그러진 효과를 만들 수 있다.
프레넬, 빛 반사효과 추가
- 프레넬을 추가해서 빛 반사 효과를 준다.
일렁임 효과 추가
- 노이즈 값과 NormalVector를 곱해서 일렁임 효과를 줄 수 있다.
투과시키는 빛 일렁임
- 투과되는 뒤쪽 배경을 일렁이고 싶다면 Refraction을 수정한다.
댓글남기기