내용 정리
림라이트 응용
스페큘러 이론
우선 램버트 라이트, 저번에 진행한 림라이트까지 준비합니다.
림라이트는 뷰 벡터(viewDir)와 월드 노말(worldNormal)또는 오브젝트의 탄젠트 노말의 dot연산으로 구할 수 있습니다.
+탄젠트 노말을 사용하고 있을 때 월드 노말을 동시에 사용하는 것은 지양합니다.
연산한 림라이트를 Emission이 아닌 Alpha에 적용해 봅시다.
반투명 오브젝트의 경우 Z-Buffer(오브젝트의 뒤에 있다고 판단한 픽셀을 그리지 않음)로 인해 다른 오브젝트와 겹쳤을 시 렌더링하는데 오류가 생깁니다.
위의 현상을 방지하기 위해 아래와 같이 알파값을 출력합니다.
ZWrite off - Z-Buffer를 사용하지 않게 됩니다.
애니메이션 추가
타임 값을 추가함으로써 오브젝트가 사라졌다 생겼다를 반복하게 만들어봅시다.
알파값을 0~1사이로 움직이게 하기 위해서는 유니티를 가동했을 때 부터 1초씩 늘어나고 있을 유니티의 타임 값에 sin함수를 사용합니다.
rim * sin(_Time.y)
그러나 그래프를 보면 범위가 -1~1사이의 값이 나오기 때문에 0이하의 색상이 나오게 됩니다.
이 문제를 해결하기 위해서는 지금까지 배운 방법들을 이용할 수 있습니다.
saturate - 1~0 외의 값을 잘라버리면서 기존 0이하의 값이 0이 되어 깜박임에 간격이 생기게 됩니다.
abs(절대값)- 음수값이 양수로 바뀌며 깜박임이 균일하지 않고 통통 튀는듯이 움직입니다.
*0.5+0.5 - 하프 램버트의 방식과 같이 균일한 움직임으로 0~1까지 깜박이는 애니메이션이 출력됩니다.
그 외에도 여러 방법으로 원하는 타이밍의 애니메이션을 만들 수 있습니다.
응용
현재까지 제작한 반투명한 오브젝트에
색상 변경, 림 두께, 애니메이션의 속도를 외부에서 조절할 수 있는 기능을 추가하자
전체 코드
스페큘러
퐁
빌퐁
림
'Unity3D > shader_스터디' 카테고리의 다른 글
[Unity 쉐이더] Reflection (0) | 2021.06.24 |
---|---|
[Unity 쉐이더] Custom Light2 - Normal, Rim Light (0) | 2021.04.08 |
[Unity 쉐이더] vector, Custom Light (0) | 2021.04.08 |
[Unity쉐이더] 라이팅 이론_Vecter (0) | 2021.03.28 |
[Unity 쉐이더] Vertex Color, Normal Map (0) | 2021.03.25 |