2022. 3. 6. 15:51ㆍUnityShader/수업 과제
이 포스팅에서는 림라이트를 이용해 반투명한 홀로그램을 만들고,
홀로그램을 깜박이거나 생동감 있게 연출해보자.
홀로그램 만들기
이전에 배운 Fresnel 공식을 연산해서 림라이트를 우선 만들어보자.
특징은 Input 구조체에서 viewDir 시선 방향 벡터를 받아와서 노말 벡터와 내적한다는 것이다.
림라이트를 손쉽게 구현했으니,
이제 림라이트를 만든 ndotv 내적값을 알파에 적용시켜보자.
그럼 아래와 같이 림라이트가 비쳤던 부분만 반투명해지는 홀로그램이 만들어진다.
여기에서는 입속까지 보이는 이슈가 발생하지만,
2Pass나 z버퍼로 해결할 수 있다.
홀로그램 효과 연출
홀로그램 깜박이기
홀로그램을 사라졌다가 생기게 하려면 알파를 완전히 0으로 만들었다가 다시 복구 시키면 된다.
이걸 반복해야 하므로 sin(_Time.y)를 곱해보자.
사라졌다가 생기는 것이 구현되었다.
그러나 sin(_Time.y)는 음수 -1까지 내려가기 때문에,
기존에 설정해둔 Emission의 색마저 반전된다는 이슈가 있다.
음수로 내려가지 않도록 해야 한다.
또한, 사라졌다가 생기는 시간 간격이 약간 길다.
음수로 내려가지 않도록 설정하면 해결되는 이슈이다.
음수가 되지 않게 하기 위한 방법은 여러가지이다.
하프램버트에서 사용했던 * 0.5 + 0.5 를 연산하는 것과,
abs()를 쓰거나, saturate()를 쓰거나이다.
모두 적용해본 결과,
abs()를 쓰는 게 내 마음에 들었다.
abs를 통해 값이 음수로 내려가지 않도록 했고,
사라졌다 생기기까지의 시간간격을 pow 제곱으로 제어했다.
곡선 그래프로 보면 abs와 pow는 이런 흐름이다.
그러므로 제곱이 클 수록 생겼다가 사라지기까지의 시간은 줄어들고,
사라졌다가 생기기까지의 시간은 늘어난다.
홀로그램다운 줄무늬 만들기
홀로그램에는 아래에서 위로 올라가면서 형태를 갱신해주는 줄무늬가 있다.
이걸 연출해보자.
아래에서 위로 올라가게 연출하기 위해
Input 구조체에서 float3 worldPos 변수를 사용하겠다.
worldPos는 월드 좌표계의 위치를 알려준다.
이 값을 Emission에 넣어보겠다.
값은 월드좌표계에서 y축의 위치를 알려준다.
Emission이 그 값을 흑백으로 출력했다.
y축으로 이동시키면 출력되는 색이 달라진다는 걸 확인했다.
이를 _Time.y 변수와 frac()함수와 pow를 이용해 줄무늬로 만들어보자.
_Time.y변수를 통해 지속적으로 y축이 변화하게 했고,
frac()함수는 지속적으로 변하는 y 값의 소수점만 반환한다.
그래서 Emission은 0에서 0.999~ 사이의 값만을 받기 때문에
지속적으로 흑백의 색을 출력한다.
그리고 pow를 통해 흰색 부분을 줄이고 흑색 부분을 늘려서 줄무늬임을 더욱 강조했다.
최종 결과물
위에서 연산한 줄무늬 효과를 알파에 적용시키면
줄무늬가 올라가는 홀로그램 완성이다.
취향에 따라 세부적인 값을 건드려 조절할 수 있다.
나의 경우에는 이렇게 했다.
줄무늬를 연산하는 holoLine 식에서 worldPos.y에 3을 곱함으로써 한번에 표현되는
줄무늬의 개수를 늘렸고, _Time.y에 2를 곱함으로써 줄무늬가 올라가는 속도를 2배로 올렸다.
그리고 pow의 제곱 인수를 2로 주어서 흰색부분을 약간만 줄였다.
알파에 값을 할당하는 식에서 ndotv와 holoLine을 서로 곱해줌으로써
홀로그램이 생기지 않는 부분(림라이트가 생기지 않은 부분(0인 부분))에서는
줄무늬도 보이지 않게 했다. 왠지 어색해서이다.
그리고 그 옆에 pow의 제곱인수를 2만 주어서
사라졌다가 생기기까지의 시간간격을 짧게 했다. (제곱 인수가 클수록 시간 간격은 늘어난다.)
'UnityShader > 수업 과제' 카테고리의 다른 글
유니티 커스텀 라이트로 블린 퐁 스페큘라 구현하기 (0) | 2022.03.05 |
---|