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