ray marching 3

반응형

기존 글 목록

https://mgun.tistory.com/5441

 

ray marching 1

이전에 ray casting에 대해 다루어 보았다.https://mgun.tistory.com/4342 ray casting을 이해해 보자..목표 ray를 이해하고 구현해보자. ray(광선) casting(투사)는 무었인가? 레이캐스팅에 대해 알기 위해서는 이

mgun.tistory.com

https://mgun.tistory.com/5462

 

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 계산을 해 볼 건데 준비물들이 좀 필요하다.

https://mgun.tistory.com/1337

 

기본적인 반사 벡터

반사벡터에 대한 이론과 언리얼 에디터에서 반사벡터 만들기는 요 링크를 참조하면 된다. 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 예제 링크

 

참고 링크

https://mgun.tistory.com/1337

 

기본적인 반사 벡터

반사벡터에 대한 이론과 언리얼 에디터에서 반사벡터 만들기는 요 링크를 참조하면 된다. 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
TAGS.

Comments