https://github.com/donguklim/vk_raytracing_tutorial_KHR/tree/master/photon_beam


엔비디아에서 만든 벌칸 샘플 프로젝트 포킹해서, 

Photon Beam, Phton mapping 구현해서 렌더링 해봤음.


Photon mapping은 대표적인 PBR 알고리즘이고,


Photon Beam은 디즈니 애니메이션 탱글드에서도 사용된 기술인데, 

공기, 안개, 구름 연기 같은 간섭 매체로 인한 빛을 구현하는데 사용하는 기술임. 



Photon mapping은 고체 표면의 빛을 표현하는데 사용하고,


Photon beam은 간섭매체에서(연기, 구름, 안개 같은거) 빛의 산란과 소실을 표현하는데 사용함.


벌칸 공부용으로, 그리고 포트폴리오 용으로 만들었는데 힘들었다. ㅠㅠ


나는 그래픽스 관련 경험은 대학교 시절 기초 2학년 그래픽스 과목 듣고, 좀 고급 4학년 모델링 과목 듣고, 

고급 4학년 렌더링 과목도 들으려다 2주만에 때려친 것밖에 없음. (2,3 주안에은 과목 취소가 가능했음.)


근데 그때는 OpenGL도 조금 야매로 배웠던것 같음. 

나 셰이더 스크립트 쓰는거 이번에 처음 배움.

대학교 시절에는 교수들이 OpenGL을 직접 사용하지 않고 다른 라이브러리를 통해 사용해서 과제 시켰던것 같습니다.


때려친 4학년 과목은 좀 이상했음. 

첫주에는 교수가 논문 읽고 발표하기 시키고, 그 다음에는 뭔 QR 코드 읽는 프로그램 만들라고 해서 때려침.

주위에도 대학원생뿐이었던것 같고, 뭔가 대학원생용 과목이었던 것 같더라.


그떄 내가 읽고 발표한 논문이 탱글드에 사용된 포톤 빔에 대한 논문이었음. 

디즈니에서 만든 논문인데, 탱글드에서 사용된 포톤 빔(광자 광선)을 응용 기술에 대한 논문이었음. 


대충 이런 내용임.

'어떻게 광자 광선을 사용해서 물리적으로 정확한 빛 보다는, 

아티스트가 다루기 쉽고, 아티스트가 그린것 같은 간섭 매체의 빛을 구현하는가`


그때 어려워서 논문 내용도 완전히 이해 못했고 빡친 경험이 있어서 

이번에 빡세게 탱글드 논문이랑 그 논문에 사용된 기본 기술인 Photon Beam 논문 다시 읽고 벌칸 공부용으로 포톤 빔을 구현함.

Photon mapping만 하면 너무 심심할 것 같고.


사실 포톤 빔만해도 되지 않을까? 

하고 처음엔 생각했는데, 


photon beam만 사용하니까 무슨 암흑 신화에 나올 것 같은 칠흑 분위기가 되거나 너무 눈부신 안개 투성이가 됨.

그리고 포톤 빔 만들어놨으면 포톤 매핑 따로 추가하는 것도 간단했고.



탱글드 논문에 나온건 포톤빔을 응용하는 기술인데, 그걸 전부 구현한건 아니고, 그냥 베이스 기술인 포톤 빔을 간단하게 구현함.

그냥 포톤 빔을 간단하게 RTX를 써서 구현하는데 집중함.


탱글드 논문에 나온 기술중에서 구현한건 원하는 색을 보이게 하기 간섭매체 파라미터 계산하는 기술뿐임.


벌칸 공부도 꽤 고생스러웠다.

벌칸에서 기본적인건 https://vulkan-tutorial.com/  여기서 배웠는데, 몇몇 디테일은 잘 설명하지 않아서 이해하기 어려웠음.

게다가 기본을 넘어서 잘 설명해주는 책이나, 모르는것을 stackoverflow에서 찾을 수 있는게 적었음.


벌칸 spec만 봐서는 뭔말인지 잘 모르겠을때가 많

벌칸 semaphore에 시그널 보내려면 어떻게 해야하는지, 셰이더에서 atomic 카운팅하려면 어떻게 해야하는지 등등 어찌 어찌 자료 찾아가면서 배웠음.



그리고 PBR 처음 해봤는데, BRDF에서 좀 햇갈리는 부분이 있어서 이해하는데 고생함.


람버시안 공식이 왜  `알베도 / 파이` 인지 몰라서 내가 뭘 잘못 애해한건가 고민함.


왜 파이로 나누지? 

반구체의 표면적 넓이(잘라진 단면 제외)인 2파이로 나눠야 하지 않나? 


근데 실제로 파이 대신 2파이 사용하면 빛이 너무 밝아짐. (빛이 반사될때마다 2배 조금 안되게 쎄져서 가하 급수적으로 밝아지게 되었음.)

뭐 내가 잘못 이해한건가? 

뭐 다른 요소가 2를 캔슬하는게 있나? 

이렇게 고민 하면서 관련 공식 가지고 몇번이나 적분하고 계산하면서 삽질함.


BRDF 값이 무한으로 나올 경우는 어떻게 해야하는지 고민함.



몇개 치명적인 버그를 만든것 떄문에 고생도 했음.

몇개 예를 들자면,


아무 물건에 부딫히지 않고 무한한 공간 저 넘어로 뻗어가는 광선을 저장하지 않았음. 

그래서 결과가 좀 더 어두웠는데 '원래 이렇게 어두운가?' 하면서 그냥 진행하다가 막바지에 꺠달아서 수정함.


광선 방향 계산할때 '광선이 시작한 위치' 마이너스 '광선이 끝난 위치' 가지고 광선 방향 계산해야하는데, 

잘못해서 '광선이 시작한 위치' 마이너스 '광선이 시작한 위치',  

이거 가지고 방향 계산했다가 division by zero가 생겨서 화면에 거뭇거뭇한 노이즈 생김.


셰이더에서 에러도 안나고 그냥 넘어가서 원인 찾는데 몇시간 고생

뭐 어디서 잘못해서 값이 0이 되서 어두운건가? 생각하면서 division by zero를 생각하지 못했음.



다른 사람들도 관심있으면 한번 코드 함 보셈. 

근데 베이스가 되는 프로젝트에서 수정한게 너무 많아서 Read me에는 그냥 대략적인 것만 적었음. 



한,두달 전에 게임 회사에서 일하고 싶어서 그냥 이력서만 가지고 지원해봤는데, 다 떨어져가지고 한번 이거 포트폴리오로 써서 다시 지원해보렵니다.

이제 영상에 자막만 달면 포트폴리오 완성.