각각의 픽셀에 닿는, 물체의 부분 면이 가지는 미세한 울퉁불퉁함 (Microfacet 이라고 함) 을 표현하기 위해서,

광선이 물체에 닿으면 그대로 끝내는게 아니라 임의 반사각으로 다시 튕겨져서 하늘로 반사광이 나올 때 까지 렌더링을 하게 함.






다만 여기서 말하는 반사광은 확산반사광 (diffuse reflection) 이라 해서,

위 짤과 같이 노멀에 대해 반구의 형태로 확산반사광의 분포가 유니폼하게 실장하는게 보통이라고 알고 있음.

그래서 나도 광선이 확산 반사할 때 최대한 반구에 노멀한 형태로 방향을 바꾸도록 함.


그러니까 위 결과 짤처럼 물체가 맞닿아있는 차폐된 곳엔 그림자가 엄청 지어지게 됨 ㅎㅎ 개굿.


덤 : AA (Antialiasing) (x4 까지) 랑 멀티스레드 지원도 함.

AA 는 튜토리얼에서 구현하도록 되어있긴 한데, 이게 AA 할 때 픽셀 샘플링 하는 방법이 리얼타임 렌더링 책에서 본 바로는, 라틴하이퍼큐브를 사용한다 해서 약간 변형해서 구현했음.

글고 멀티스레드는 싱글로 렌더링하는게 넘나 느려서 그냥 저어가 알아서 구현함.


덤 2 : 노이즈 줄일려고 픽셀 당 몇번 반복해서 레이를 쏠지도 추가해봤음. 밑 짤은 2560 x 1440 으로 한 픽셀에 레이를 32번 * 서브픽셀 4번 으로 쏜 것.



덤 2 : 디퓨즈 확산 모델의 램버트 (Lambertian) 이랑 메탈릭 구현해봄. 카메라도 이동 가능하게 하고, 안티 에일리어싱 샘플링도 x8 까지 구현.

샘플링을 x8까지 돌리면 큰 사이즈로 렌더링하고 줄이지 않고, 그냥 보통 사이즈로 렌더링 해도 대충 준수하게 렌더링 됨 ㅇㅇ...

밑짤은 800x480 으로 그냥 그대로 렌더링 돌린거.