Graphics Programming

레이트레이싱 본문

Season 1/OpenGL

레이트레이싱

minseoklee 2018. 7. 6. 21:32


포워드, 디퍼드 렌더링만 만들다가... PBR을 하려니 레이트레이싱을 알아야 하는 것 같아서 뒤늦게 코딩해보고 있다. 맨날 책에서 읽고 만들어야지 하다가 말았는데 겨우 첫 걸음을 떼었다.


요즘 너무 예제 코드를 그대로 치는 것 같아서 기억에만 의존해서 코딩을 해봤는데 다행히 성공했다. 완전히 빡대가리가 되지는 않았나 보다. 그래도 머리가 예전처럼 잘 안 돌아가는 걸 느낀다. 벌써 이러면 나중에 어떡하지...


화면의 각 픽셀에 대응하는 3D 점은 무수히 많다. 그런 점들 중 하나를 uv로부터 얻어내고 가상의 카메라 위치에서 이 점으로 광선을 쏜다. 광선과 구가 교차하는지 검사하고, 그렇다면 구의 방정식에서 P(위치), N(법선) 등을 얻을 수 있다. 이후 셰이딩은 포워드/디퍼드에서 하던 것과 동일하다.


구는 방정식도 깔끔하고 해석적인 해도 잘 나오니까 이렇게 했지만, 복잡한 음함수는 레이 마칭으로 구현하는 것 같다. 마칭 큐브를 이용해 음함수로부터 폴리곤 메시를 생성하는 걸 해봤으니까 레이 마칭도 짤 수 있을 것 같다.



그림자는? 광선과 물체의 교차점 P에서 태양광을 뒤집어(-L) 광선을 쏘고, 다른 물체와 교차하는지 검사한다. 교차하면 뭔가가 가리고 있다는 거니까 검은색으로 만든다. 섀도우맵 그리는 것보다 훨씬 간단하다.


간접광, 즉 다른 물체로부터 반사된 빛도 적용하려면 indirect light transport라고 하는 것 같은데 다시 P에서 시작해서 표면 법선 N이나 하프 벡터 H 방향으로 광선을 쏴서 다른 물체와 교차하는지 보고, 그 물체의 radiance를 계산에 포함하면 되지 않을까?


Comments