스키닝과 트위닝으로 자연스러운 모션과
부드러운 애니메이션 간 전환을 구현했습니다.
동일한 메쉬와 머테리얼을 가진 여러 물체의 위치 정보를 모아
하나의 자료형으로 전달해 드로우콜을 감소시켰습니다.
인스턴싱으로 물체들을 렌더링하기 위해
Update 시 마다 object가 소유한 Component(Renderer)로 렌더링하던 로직을
InstanceManger로 통합해 렌더링 하도록 수정했습니다.
8비트 포멧의 Height Map 정보를 파싱해
그리드의 높낮이를 렌더링 했습니다.
카메라를 구의 중심에 고정한 후
카메라의 회전에 따라 메쉬가 움직이도록 조정해
Sky box를 구현했습니다.
카메라의 시선 벡터와 물체의 위치 정보를 통해
물체가 카메라의 시선 벡터에 맞춰 회전하도록 구현했습니다.
뷰포트(2D)에서 월드 스페이스(3D)로 좌표를 변환시켜
마우스가 위치한 지점에서 빛을 쏴
충돌한 물체가 클릭에 반응하도록 했습니다.
Orthographic 카메라로
특정 위치에 고정된 버튼을 그린 후
Ray Picking으로 사용자 입력에 반응하도록 구현했습니다.
물체와 빛의 Ambient, Diffuse, Specular 정보를 섞어
빛의 방향에 따른 자연스러운 색상을 구현했습니다.
Specular의 경우
빛의 역방향 벡터와 일치하는 노말 벡터 뿐 아니라
해당 노말 벡터와 pi 가량의 사잇값을 가진 후면 벡터에도
Specular 효과가 적용되는 문제가 있었습니다.
이를 수정하기 위해 acos을 활용해 세타를 추출하고
해당 값이 0.75 * pi를 넘어가는 경우
효과가 적용되지 않도록 제한을 걸어 해결했습니다.
카메라의 시선 벡터와 물체의 노말 벡터를 섞어
물체의 외곽선을 강조하는 조명을 구현했습니다.
RGB 정보로 저장된 노말맵을 파싱한 후
해당 정보를 Tangent Space에서 World Space로 변환 후
쉐이더 파일에서 추가적인 연산을 통해
물체의 디테일한 질감을 구현했습니다.