ray marching 3
기존 글 목록
ray marching 1
이전에 ray casting에 대해 다루어 보았다.https://mgun.tistory.com/4342 ray casting을 이해해 보자..목표 ray를 이해하고 구현해보자. ray(광선) casting(투사)는 무었인가? 레이캐스팅에 대해 알기 위해서는 이
mgun.tistory.com
ray marching 2
ray marching 1.https://mgun.tistory.com/5441 ray marching 1이전에 ray casting에 대해 다루어 보았다.https://mgun.tistory.com/4342 ray casting을 이해해 보자..목표 ray를 이해하고 구현해보자. ray(광선) casting(투사)는 무
mgun.tistory.com
지난글에서 ray marching의 개념. ray tracing, ray casting 과의 차이점들을 이야기 하였고
ray marching에서 중요한 부분인 SDF에 대해 이야기 하였다.
그리고 이 SDF를 활용하여 간단한 구를 그려보았다.
이젠 이 결과물에 조명 개념을 더해보자.
간단한 phong 계산을 해 볼 건데 준비물들이 좀 필요하다.
기본적인 반사 벡터
반사벡터에 대한 이론과 언리얼 에디터에서 반사벡터 만들기는 요 링크를 참조하면 된다. http://mgun.tistory.com/1306 반사벡터 공식은 R = -E + 2*dot(N,E)*N 라고 했다. 언리얼 머티리얼 세이더에서는 이
mgun.tistory.com
반사벡터 공식은 R = -E + 2*dot(N,E)*N 라고 했다.
출처: https://mgun.tistory.com/1337 [Go crazy for anything that will make you smile.:티스토리]
그래, 지금 당장 필요한건 N(normal)이다.
일반적으로 법선은 vertex(정점)을 통해 얻을 수 있고, pixel의 법선은 vertex의 법선을
보간하여 얻을 수 있다.
그런데 SDF로 정의된 장면의 표면 법선은 어떻게 얻을 수 있을까?
수치미분(Numerical Gradient) :
SDF는 점에서의 거리값을 반환하므로, 각 방향(x,y,z)에 대해 차분을 사용해 변화량을 계산하여
이를 통해 그래디언트를 추정한다.
vec3 estimateNormal(vec3 p) {
return normalize(vec3(
sceneSDF(vec3(p.x + EPSILON, p.y, p.z)) - sceneSDF(vec3(p.x - EPSILON, p.y, p.z)),
sceneSDF(vec3(p.x, p.y + EPSILON, p.z)) - sceneSDF(vec3(p.x, p.y - EPSILON, p.z)),
sceneSDF(vec3(p.x, p.y, p.z + EPSILON)) - sceneSDF(vec3(p.x, p.y, p.z - EPSILON))
));
}
위 식에서 하는일은 3D 좌표상의 한 점 p에서 앞뒤 양옆 좌우의 차이값에 의한 변화량을
체크해서 이 값으로 x축, y축, z축의 방향성을 구한다.
이 값을 정규화 시켜서 단위벱터로 만들어 법선벡터로 쓴다.
개념을 간단하게 풀자면 이렇다.
"어느 방향으로 거리가 가장 빨리 멀어지는지를 측정해서, 바깥방향을
가리키는 벡터를 어림잡아 추측하는것."
이런 신기방기한 방식이?
늘 정점이 넘겨주는 법선만 쓰다가 이렇게 법선을 추정해서 쓰는 방식이 있다니!!
나도 놀랐다.
이렇게 N을 구했다.
이제 필요한 건 ambient, diffuse, specular light다.
위에서 링크한 기본적인 반사벡터를 참고하자.
나머지 값들은 임의의 값들을 정해서 퐁 라이닝을 구현할 수 있다.
https://www.shadertoy.com/view/lt33z7
Shadertoy
0.00 00.0 fps 0 x 0
www.shadertoy.com
참고 코드가 있는 shader toy 예제 링크
참고 링크
기본적인 반사 벡터
반사벡터에 대한 이론과 언리얼 에디터에서 반사벡터 만들기는 요 링크를 참조하면 된다. http://mgun.tistory.com/1306 반사벡터 공식은 R = -E + 2*dot(N,E)*N 라고 했다. 언리얼 머티리얼 세이더에서는 이
mgun.tistory.com
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
'Study > Graphics ' 카테고리의 다른 글
ray marching 4 (0) | 2025.03.30 |
---|---|
ray marching 2 (0) | 2025.03.23 |
ray marching 1 (0) | 2025.03.09 |
ray casting을 이해해 보자.. (0) | 2023.01.10 |
(OpenGL) 도넛,큐브,원,사각형 그리기 (0) | 2022.11.19 |