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에는 그냥 대략적인 것만 적었음.
한,두달 전에 게임 회사에서 일하고 싶어서 그냥 이력서만 가지고 지원해봤는데, 다 떨어져가지고 한번 이거 포트폴리오로 써서 다시 지원해보렵니다.
이제 영상에 자막만 달면 포트폴리오 완성.
멋져용 나도 구현해보고 싶다 - dc App
오 머단해... 레이트레이싱 파이프라인 사용한거? 포톤 매핑이 부하가 좀 큰가 프레임이 안나오네
지원은 엔진 프로그래머쪽으로 가는거?
레이트레이싱 파이프 라인 2개 사용.
엔진 프로그래머 하고 싶음. 대략 적인 구조가 빔/포톤 매핑을 위한 레이트레이싱 돌리고, 그거 끝나는거 host사이드에서 기다리고, 화면을 그리기 위한 레이트레이싱을 각 스왑 체인 이미지 별로 포톤/빔 틀라스 만드는거 싱크를 맞추기 위한 timeline semaphore를 추가함. 리프레쉬 버튼 누를 때마다 기존 포톤/빔 tlas 지우고 다시 tlas 만듬.
윈도우 엑스박스 게임바로 화면 찍었는데, 포톤 수치 최대로 올렸을떄 엑스박스 게임바 키면 2배로 느려지는 것 같음. 엑스박스 게임바 끄면 그렇게 느리진 않음.
포톤매핑이랑 렌더를 위한 레이트레이싱이랑 필요한 TLAS 메쉬 구성이 다른거야?
내가 이해한건 약간 디퍼드렌더링마냥 포톤맵 레이트레이싱으로 포톤맵 텍스쳐 생성 -> 생성된 포톤맵을 렌더를 위한 레이트레이싱 쉐이더에서 사용하여 포톤맵이 적용된 결과물 생성 이런식인데
맞게 이해한건지 모르겠네
다름. 포톤/빔 매핑을 위해서 3d 폴리곤 모델 tlas를 사용해 라이트 트레이싱 하고, 그렇게 생성된 포톤 데이터는 AABB tlas를 사용함. 카메라 레이 트레이싱 단계에서는 둘다 사용함. 3d 모델 tlas로 ray의 길이와 ray가 어떤 물건에 부딪히는지 구하고, 포톤/빔 tlas로 레이가 물건에 도달하는 도중에 접하는 빔과 포톤을 구함.
TLAS를 쉐이더 안에서 동적으로 생성할 수 있는거야?? DXR에서도 지원하는지 모르겠네
텍스쳐를 사용하지는 않고, storage buffer가 2개 있어서 하나는 빔 데이터를 array로 저장하고 다른 하나는 tlas를 만들기 위한 VK tlas instance info 스트럭쳐를 저장함.
GPU 버퍼에 저장해놓고 CPU에서 다시 읽어서 그거 기반으로 CPU에서 TLAS 빌드한다는 이야기 맞지?
Timeline sephamore는 dx12에서 펜스 말하는거라고 생각하면 되려나
완전히 그렇게 안됩니다. ㅠㅠ 그래서 고생함. tlas 생성을 위헌 커맨드를 날리려면 생성하는 instance 갯수가 필요한데, 이건 Host 사이드에서 필요함. 벌칸 커맨드를 날려서 '이쪽에 몇개 생성할지 적혀있으니까 여길 봐' 라고 할 수가 없음. Fence 사용해서 host 사이드에서 라이트 트레이싱 기다린 다음. instance 갯수 기록한 카운터 읽고, tlas 생성 커맨드 날리고, tlas 완성되는것도 Fence 걸고 기다림. tlas 완성되기 전에 파이프라인에 tlas 주소 바인드하고 레이트레이싱 하면 안되니까.
cpu에서는 tlas를 생성하기 위한 instance 데이터는 읽지는 않고, 몇개 만들어졌는지 갯수 저장한 부분만 읽습니다. i커맨드에는 갯수와 instance 생성 데이터가 저장된 메모리 주소만 있으면 되니까.
GPU 버퍼에 기록해놓은 인스턴스 데이터를 그대로 TLAS 빌드할때 주소 가져와서 읽게 만들 수 있다는건가? 신기하네
DXR에서는 내가 알기로 지오메트리 디스크립터 채워서 그거 기반으로 BLAS만들고 TLAS 디스크립터에 연결하는 방식으로 CPU 기반으로만 AS를 빌드할 수 있는걸로 아는데, 벌칸은 뭔가 유연하구나
이게 어딜봐서 초보야!!!!!!!!!!
벌칸 배운지 2달 되었음. 다이렉트 X나 언리얼 같은건 건드린적도 없고, OpenGL은 몇년점 조금 다뤘을 뿐이고. 게다가 그것도 직접 다룬건 아니고 교수가 알려준 다른 라이브러리 사용했던것 같고.
암튼 잘하넹... 나도 PBR 끝내면 포톤 매핑이나 해봐야겠다
그렇게 생성된 포톤 데이터는 AABB tlas를 사용함. - > 그렇게 생성된 포톤 데이터로 AABB tlas를 만듬.
내가 알기로 벌칸에서 traingle 폴리곤과 AABB를 같은 tlas안에 넣을 수 없음.
해당 댓글은 삭제되었습니다.
두달 동안 한거
https://vulkan-tutorial.com/
이거 공부하고,
https://themaister.net/blog/2019/08/14/yet-another-blog-explaining-vulkan-synchronization/
https://github.com/nvpro-samples/vk_mini_path_tracer
(엑스트라 챕터는 공부 안함)
https://github.com/nvpro-samples/vk_raytracing_tutorial_KHR
(any hit, intersection 등 필요한 엑스트라 챕터 추가로 공부)
그리고 포톤 빔 논문 (github 레퍼런스 목록에 있음.)도 읽음. 논문 이해하려고 읽는 기간만 3,4일 걸린것 같음.
아참. 위에것들 공부하기전에 몇년전 대학교때 배운 그래픽스 기초 다시 기억하려고,
https://learnopengl.com/
이거 공부함.