ray marching 2
ray marching 1.
ray marching 1
이전에 ray casting에 대해 다루어 보았다.https://mgun.tistory.com/4342 ray casting을 이해해 보자..목표 ray를 이해하고 구현해보자. ray(광선) casting(투사)는 무었인가? 레이캐스팅에 대해 알기 위해서는 이
mgun.tistory.com
본격적으로 ray marching 알고리즘 및 구현에 대해 자세히 이야기 해 보자.
RayMarching의 핵심 알고리즘은 광선(Ray)를 전진시키면서 표면에 도달했는지를 반복 체크하는것이다.
이를 위해 사용하는 함수가 SDF다.
SDF (Signed Distance Functions)을 활용 하는데 이 함수는 공간상의 점 좌표를 전달하면
해당 점과 surface(표면 사이의 최단 거리를 반환한다.
반환값의 부호는 해당 점이 표면 내부에 있는지, 외부에 있는지를 나타낸다.
구를 예로 들어 보자.
구의 중심이 원점이고 반지름(r)이 1인 구의 첫번째 SDF는 아래와 같다.

이제 여기서 임의의 점을 SDF로 전달한다고 생각해 보자.
f(1,0,0) = 0. 구의 표면에 딱 맞게 도달해 있다.
f(0, 0, 0.5) = -0.5. 구의 표면 내부에 있으며 표면으로 부터 0.5 떨어져 있다.
f(0, 0, 1.5) = 0.5. 구의 표면 외부에 있으며 표면으로 부터 0.5 떨어져 있다.

위 그림은 세 점의 위치를 표시한 것이다.
이 알고리즘을 코드로 작성해 보자.
이미 준비되어 있는 함수가 있다.
https://registry.khronos.org/OpenGL-Refpages/gl4/html/length.xhtml
length - OpenGL 4 Reference Pages
registry.khronos.org
length는 벡터의 길이를 반환해 준다.
우리는 반지름 1인 구를 기준으로 하니까 함수의 내용은 대략 아래와 같을 것이다.
return length(samplePoint) - radius;
이제 좌표를 입력만하면 표면과의 거리를 부호와 함께 알려주는 함수를 만들었다.
간단한 SDF를 보았는데, 좀 더 여러가지 SDF 함수를 보고싶다면 아래 링크를 추천한다.
https://iquilezles.org/articles/distfunctions/
Inigo Quilez
Articles on computer graphics, math and art
iquilezles.org
레이마칭 알고리즘을 알아보자.

위 그림은 레이트레이싱을 설명하는 그림 이지만 어차피 방식은 같다.
카메라의 위치를 정하고, 카메라에서 이미지 플랜(격자)으로 픽셀별 view ray를 만들어 준다.(빨간 선)
여기서 각 격자지점은 출력이미지의 픽셀에 해당한다.
격자 크기가 1024x768이라면 출력이미지의 해상도가 1024x768이다.
레이트레이싱은 일반적으로 명시적 지오메트를 기준으로 정의되는데 뷰 레이와 장면의
교차점을 찾기 위한 일련의 교차점 테스트를 수행한다.
레이마칭에서 전체장면은 SDF에 따라 정의된다.
뷰 레이와 장면의 교차점을 찾으려면 카메라에서 시작해서 뷰 레이를 따라 점을
조금씩 이동하며 각 단계에서 이 점이 표면 내부에 있는지를 체크한다.
내부에 있게되면 이 함수는 끝이 난다.
이러한 정석의 방식으로 매번 뷰 레이를 조금씩 진행할 수 있지만 "구면 추적"을 사용하여
속도와 정확도를 향상시킬 수 있다.
즉, 매번 작은 걸음을 내 딛는 것 대신 표면을 통과하지 않고도 안전하다고 알고 있는
최대 걸음을 내딛을 수 있다.
Chapter 8. Per-Pixel Displacement Mapping with Distance Functions
In this chapter, we present distance mapping, a technique for adding small-scale displacement mapping to objects in a pixel shader. We treat displacement mapping as a ray-tracing problem, beginning with texture coordinates on the base surface and calculati
developer.nvidia.com
여기서 이에대한 설명이 나온다.


1. Uniform Step Ray Marching
- 일정 간격으로 작게 전진하면서 구에 접근한다
- 많은 스텝이 필요하고, 초반에는 거의 의미없는 이동이 반복된다.
2. Sphere Tracing
- 거리 함수가 알려주는 안전 거리만큼 한 번에 전진한다.
- 초반에 크게 전진하다가 점점 가까워지면 step이 작아지며 수렴한다.
- 훨씬 작은 스텝으로 빠르게 도달가능하다.

위 코드에서는 SDF를 통해 현재 내 픽셀이 객체 표면에서 얼마만큼 떨어져 있는지
구면측정을 통해 최소거리를 반환하고, 다음 레이마칭시에는 이 거리만큼 이동한다.
여기까지 레이마칭의 기본개념과 레이마칭의 핵심중 하나인 SDF에 대해 알아보았다.
참고 :
https://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/
Ray Marching and Signed Distance Functions
One of the techniques used in many demo scenes is called ray marching. This algorithm, used in combination with a special kind of function called
jamie-wong.com
Chapter 8. Per-Pixel Displacement Mapping with Distance Functions
In this chapter, we present distance mapping, a technique for adding small-scale displacement mapping to objects in a pixel shader. We treat displacement mapping as a ray-tracing problem, beginning with texture coordinates on the base surface and calculati
developer.nvidia.com
https://en.wikipedia.org/wiki/Ray_marching
Ray marching - Wikipedia
From Wikipedia, the free encyclopedia 3D computer graphics rendering method Ray marching is a class of rendering methods for 3D computer graphics where rays are traversed iteratively, effectively dividing each ray into smaller ray segments, sampling some f
en.wikipedia.org
'Study > Graphics ' 카테고리의 다른 글
ray marching 4 (0) | 2025.03.30 |
---|---|
ray marching 3 (0) | 2025.03.29 |
ray marching 1 (0) | 2025.03.09 |
ray casting을 이해해 보자.. (0) | 2023.01.10 |
(OpenGL) 도넛,큐브,원,사각형 그리기 (0) | 2022.11.19 |