
### 2일차
**2일차**에는 렌더 타겟 사용법을 익혔습니다.
Direct3D면 몰라도 Three.js는 처음 사용하는 라이브러리이고 수업에서도 제대로 배우지 않았으니 많은 구글링을 요구했습니다.
렌더 타겟 다루는 법을 안 뒤에는 기본 장면을 `originalRT`에 렌더했습니다.
그 다음에 할 일은 렌더 타겟에 깊이 텍스처를 넣는 것이었습니다.
[Three.js webgl_depth_texture](https://github.com/mrdoob/three.js/blob/master/examples/webgl_depth_texture.html) 예제가 많은 도움이 됐습니다.
추가 코드는 예상 외로 쉬웠습니다만, 실제로 잘 찍혔는지 봐야 하는데 전부 하얘서 손을 좀 봐야 했습니다.
깊이 텍스처까지 완성한 후에 GLSL 셰이더 사용법을 공부했습니다.
[Three.js webgl_postprocessing](https://github.com/mrdoob/three.js/blob/master/examples/webgl_postprocessing.html) 예제를 참고해 후처리에 사용되는 셰이더는 뭔가 다르다는 것을 알아챘습니다.
후처리 셰이더의 경우 `ShaderPass`와 `EffectComposer`를 무조건 사용해야만 했기에 그것들도 모두 공부해야 했습니다.
그래도 사용법이 쉬워서 참 다행이었습니다.
`ShaderPass`의 경우, Screen-aligned quad 도형을 자동으로 넣어주는 클래스였습니다.
`EffectComposer`는 그러한 `ShaderPass`를 렌더링해주는 대기열 클래스였습니다.
이후 GLSL을 사용해 가중치 추출 셰이더를 만들고 화면에 렌더하여 확인하는 데 성공했습니다.
저에게 있어 Three.js는 처음 사용하는 라이브러리이고, 수업에서도 완전히 다루지 않았기 때문에 더 알아볼 필요가 있었습니다.
렌더 타겟 다루는 법을 어느 정도 알아낸 뒤에는 기본 장면을 `originalRT`에 그렸습니다.
그 다음에 할 일은 렌더 타겟에 깊이 텍스처를 추가하는 것이었습니다.
이는 [Three.js webgl_depth_texture](https://github.com/mrdoob/three.js/blob/master/examples/webgl_depth_texture.html) 예제가 많은 도움이 되었습니다.
깊이 텍스처까지 완성한 후, GLSL 셰이더 사용법을 공부했습니다.
[Three.js webgl_postprocessing](https://github.com/mrdoob/three.js/blob/master/examples/webgl_postprocessing.html) 예제를 참고해 후처리에 사용되는 셰이더는 기존 방식과 뭔가 다르다는 것을 알아챘습니다.
후처리 셰이더의 경우 `ShaderPass`와 `EffectComposer`를 반드시 사용해야 했습니다.
`ShaderPass`의 경우, Screen-aligned quad (화면을 꽉 채우는) 도형을 자동으로 넣어주는 클래스였습니다.
`EffectComposer`는 그러한 `ShaderPass`들을 차례대로 그려주는 대기열 클래스였습니다.
이후 GLSL을 사용해 가중치 추출 셰이더를 만들고 화면에 렌더하여 결과를 확인하는 데 성공했습니다.
### 3일차
**3일차**에는 라이트 셰프트 셰이더를 만들었습니다.
렌더몽키에서 사용했던 알고리즘 그대로 GLSL화 하여 만들었는데, 문제가 하나 있었습니다.
바로 태양의 위치를 월드 좌표계에서 UV 좌표계로 변환하는 일이었습니다.
저는 카메라로부터 뷰 행렬과 프로젝션 행렬을 가져오는 방법을 몰랐기에 많이 방황했습니다.
이후 3차원 벡터에 `project()` 함수가 있다는 것을 깨달았으나 그마저도 오류가 많이 나 시간을 많이 잡아먹었습니다.
많은 노력 끝에 완전히 성공한 셰이더의 모습을 확인할 수 있었습니다.
하지만 아직 GUI 추가 및 카메라 움직임 등 할 것들이 많이 남아있었습니다.
렌더몽키에서 사용했던 알고리즘 그대로 GLSL로 변환하여 만들었는데, 문제가 하나 있었습니다.
바로 광원의 위치를 월드 좌표계에서 UV 좌표계로 변환하는 일이었습니다.
저는 Three.js에서 카메라로부터 뷰 행렬과 투영 행렬을 가져오는 방법을 잘 몰랐기에 많이 방황했습니다.
이후 3차원 벡터에 `project()` 함수가 있다는 것을 깨달았으나 그마저도 제대로 사용하지 못해 시간을 많이 뺏겼습니다.
그래도 결국 완전히 성공한 셰이더의 모습을 확인할 수 있었습니다.
물론 아직 GUI 셋업 및 카메라 움직임 등 할 것들이 많이 남아있었습니다.
### 4일차
**4일차**에는 뒷정리 및 부가 기능을 개발했습니다.
**4일차**에는 뒷정리 및 부가 기능들을 개발했습니다.
튜토리얼의 7장에 해당하는 내용입니다.
프리셋 기능은 시간이 많이 걸렸지만 은근 쉬웠습니다.
태양의 자동 움직임 기능은 `Clock`의 `getDelta()` 함수를 사용했는데, 이 함수의 결과가 제가 알던 방식의 값과 조금 달라서 놀랐습니다.
유니티 같은 게임 엔진을 보면 이전 프레임과 현재 프레임 사이의 값을 반환하는 것이 원칙인데 여기의 함수는 직전의 `getDelta()` 함수와의 시간차이를 반환했습니다.
삼각함수와 함께 부드러운 움직임을 구현한 후 태양 오브젝트 변경 기능을 만들었습니다.
처음엔 리사 수의 사진을 넣어볼까 했는데 프로젝트가 MIT 라이선스인지라 관뒀습니다~(리사 수는 MIT에서 박사 학위까지 땄지만 말입니다 하하)~.
이후 제가 직접 짱 귀여운 고양이를 그려서 넣었습니다.
그렇게 부가 기능도 끝나고 이제 튜토리얼만 남은 상황이었습니다.
프리셋 기능의 추가는 시간이 꽤 걸렸지만 그래도 난이도는 쉬웠습니다.
광원의 자동 움직임 기능은 `Clock`의 `getDelta()` 함수를 사용했습니다.
삼각함수와 함께 부드러운 움직임을 구현한 후 광원 오브젝트 변경 기능을 만들었습니다.
그렇게 부가 기능도 끝나고 이제 튜토리얼 작성만 남았습니다.
### 5~7일차
**5일차부터 7일차**에는 `readme.md` 파일에 마크다운으로 튜토리얼을 작성했습니다(이때는 `index.html`에 작성해야 한다는 사실을 몰랐습니다).