프로그래밍/기타

[HKU] 렌더링 기법 RayTracing, RayMarching, PathTracing 장점과 단점 비교

하루에 한번 방문하기 2020. 10. 22. 19:02

HKU 대학교 Niel 교수님의 오늘 맡아주신 수업 내용을 요약했습니다.

RayTracing :

레이트레이싱 적용 전과 후 사진. NVIDIA 사의 RTX로 무거운 레이트레이싱 연산을 해결했다.

RayTracing : 

  가상적인 광선이 물체의 표면에서 반사되어,

  카메라를 거쳐 다시 돌아오는 경로를 계산한다. 
  적게는 물체 하나가 반사하는 빛만 계산하면 되지만
  많은 물체를 구성하는 입자 하나하나의 빛을 전부
  계산해야하기 때문에 렌더링 기법 중 시간이 많이 소요되는 기술이다.

장점 : 

  - Rasterized 렌더링에 비해 라이팅이 현실적이다.

  - 그림자, 반사, 굴절의 구현이 쉽다.

  - 병렬화 계산(GPU 연산)에 적합하다. (각 광선은 다른 광선과 독립적으로 계산된다)

단점 :

  - 다각형 메쉬의 교차점(각진 부분)에 대해 무거운 연산을 한다.

    (원문 : Calculating intersection points for polygonal meshes is computationally heavy;)

  - Fragment / Compute 셰이더를 사용할 때 재귀성 문제가 일어난다.

      (원문 : Problem of recursivity when using fragment / compute shaders; )


RayMarching


RayMarching(레이 마칭) : 표면에 가까워질때까지 광선을 다가가게 한다.

장점 : 
  - 교차점(각진 부분) 표현이 어려울 때 레이트레이싱보다 낫다.

     (원문 : Better than raytracing when it's difficult to determine intersection points;)

  -  Rasterized 렌더링에 비해 라이팅이 현실적이다.

  - 병렬화 계산(GPU 연산)에 적합하다. (각 광선은 다른 광선과 독립적으로 계산된다)
  
  - 곡면 필드 렌더링이 비교적 쉽다.

     (원문 : Relatively easy to render non-Euclidian geometry, signed distance fields;)

단점 :
  - 복잡한 다각형 메시를 렌더링 할 때 레이트 레이싱보다 성능이 더 나쁘다.

     (원문 : Worse than raytracing with complex polygonal meshes; )
  - Fragment / Compute 셰이더를 사용할 때 재귀성 문제가 일어난다.

사용 예시 :

  - 구름 등 : 부드러운 오브젝트를 표현할 때 폴리곤을 여러 장 겹쳐서 쓰는 경우가 많은데,

이러한 상황에서의 대체 용도로 레이마칭의 활용도가 높다.

언리얼엔진 유체 시뮬레이션 : https://shaderbits.com/blog/ray-marched-heightmaps

  - 코스트가 가벼운 반사 표현 : SSR적 굴절 표현에서는 화면 밖 오브젝트가 굴절해 보이는 경우는 없다.
하지만 레이마칭 렌더링 기반으로 작동한다면 구현 가능하다.

움직이는 사진 : The Tomorrow Children의 그래픽 효과

레이마칭 관련 링크(더보기 클릭)


Pathtracing : 


  PathTracing :

  모든 물체에 랜덤 방향의 Ray를 추적시켜 엄청난 사실성을 자랑한다. (레이트레이싱보다 더 연산이 무겁다)
  실제로 현실에서 모든 물체는 빛을 반사, 흡수하고, 여러 번 반사된 빛이
  최종적으로 눈에 들어와서 색이 인지되는 것인데
  이를 최대한 따라한 것이다.
  현실의 빛 효과를 완벽히 따라한 이런 효과들
 (soft shadows, depth of field, motion blur, caustics, ambient occlusion,
 indirect lighting, etc..)을 간접적으로 표현할 수 있게 된다.

PathTracing 원문

장점 :

  - 간접 조명에 유용하다. (글로벌 일루미네이션)

  - Rasterized 렌더링에 비해 라이팅이 현실적이다.

  - 병렬화 계산(GPU 연산)에 적합하다. (각 광선은 다른 광선과 독립적으로 계산된다)

단점 :

왼쪽 : 노이즈 제거 전, 오른쪽 : 노이즈 제거 후

  - 랜덤 방향의 Ray를 추적하기에 결과가 종종 매우 혼잡(Noisy)해진다.

    때문에 노이즈 제거 패스가 필요하다. (보통 blue noise 샘플링 텍스쳐와 함께 사용한다)

    관련 내용(더보기 클릭) 

더보기

  - 다각형 메쉬의 교차점(각진 부분)에 대해 무거운 연산을 한다.

  - Fragment / Compute 셰이더를 사용할 때 재귀성 문제가 일어난다.


마치며 정리 :

원문


- Raytracing, Raymarching, Pathtracing을 위한 벡터 수학은 비교적 쉽다.

- 현실적인 조명 효과는 상대적으로 구현하기 쉽다.

Ray-Triangle Intersection

- Ray-Triangle Intersection은 계산 비용이 많이 든다.

  (*그러나 RTX 카드는 우리를 위해 Ray-Triangle Intersection을 계산할 수 있다.)

- 렌더링 비용은 그릴 픽셀 수에 따라 조정된다.

- 렌더링 비용은 렌더링 할 형상의 양에 따라 조정된다.

  (* 따라서 카메라에 보이지 않는 부분 제거(culling)를 권장한다.)


추가 수업 내용 :

추가 수업 내용 : 법선 백터(normal Vector)를 사용해 라이팅 소스와 가까운 쪽 밝게하기
추가 수업 내용2 : 월드 좌표에 대한 텍스쳐 매핑 : https://www.ronja-tutorials.com/2018/05/11/triplanar-mapping.html


Niel 교수님의 추가 학습 주제 추천

+ T&L 가속
+ 플렛 쉐이더
+ Gouraud 음영 셰이더
+ 퐁 셰이더 기법


레이트레이싱 말고 나머지 두개는 몰랐는데, 배우는게 정말 많네요.

레이트레이싱(Ray Tracing) : 물체에 빛을 쏘아 반사된 빛을 추적한다.

레이마칭(Ray marching) : 표면에 

경로 추적(Path Tracing) : 모든 물체에 랜덤 방향의 Ray를 추적시켜 현실 빛 효과를 재현한다.