본문 바로가기

Unity3D/shader_스터디

커스텀라이트(3) 림라이트, 스페큘러

내용 정리

 

림라이트 응용

스페큘러 이론


 

 

우선 램버트 라이트, 저번에 진행한 림라이트까지 준비합니다. 

 

림라이트는 뷰 벡터(viewDir)와 월드 노말(worldNormal)또는 오브젝트의 탄젠트 노말의 dot연산으로 구할 수 있습니다.  

 

+탄젠트 노말을 사용하고 있을 때 월드 노말을 동시에 사용하는 것은 지양합니다.

 

 

dot (worldNormal, viewDir)
dot (Normal, viewDir)

 

 

연산한 림라이트를 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까지 깜박이는 애니메이션이 출력됩니다.

 

그 외에도 여러 방법으로 원하는 타이밍의 애니메이션을 만들 수 있습니다.

 

 


응용

현재까지 제작한 반투명한 오브젝트에
색상 변경, 림 두께, 애니메이션의 속도를 외부에서 조절할 수 있는 기능을 추가하자

전체 코드

더보기
 

 

 

 


스페큘러

빌퐁