5. Perlin Noise

이현기·2022년 8월 13일
0

RayTracing:The-Next-Week

목록 보기
5/9
  • 주의 사항
  1. 이 글은 RayTracing:The Next week을 공부하며 작성한 글이다.
  2. 모든 사진, 글은 RayTracing:The Next week에서 가지고 왔다.
  3. 영어 해석, 이론적으로 틀린 내용이 존재할 경우가 매우 크다. (지적해주시면 감사합니다.)
  4. 글을 쓰는 능력이 매우 안좋으니 이해해주세요. 연습 중 입니다.

책 초반부에 이야기가 나왔던 가장 어려운 두 파트 중 Perlin Noise를 공부할 차례이다. 이번에도 열심히 해보자.

Perlin Noise란?

보기에 멋지고 단단한 texture를 표현하기 위해서 사람들은 많은 형태의 perlin noise를 사용한다. 이것들은 perlin의 이름을 따서 Noise의 이름을 따서 만들었다고 한다. perlin texture는 white noise를 return하지 않는다. 아래 사진을 보자.

위의 사진은 white noise 사진이다.

이미지 프로세싱을 공부하다 보면 white noise를 없애기 위해서 많은 공부를 했던 것이 생각이 났다.

대신 아래처럼 Perlin texture는 조금 blur가 처리된 white noise를 return 한다.

perlin noise의 핵심 key는 반복이 가능하다는 것이다. 입력으로 3D point를 가져오고 항상 동일한 임의의 number를 return한다. 근처의 point들은 비슷한 숫자를 return하게 된다. 다른 perlin noise의중요한 부분은 매우 간단하고 빠르게 처리를 할 수 있다. 그래서 자주 사용이 된다는 이야기인 것 같다.

Code를 작성하면서 바로 실습으로 하는 예제가 많다. 따라해보자!

먼저 노이즈를 가진 사진을 만들어 보는 실습을 진행했다.

trilinear interpolation 을 진행하여 패턴을 조금 더 흐릿하게 만들어 주었다.

위의 결과 보다 조금 더 나은 모습을 띄지만 아직 그리드? 블럭? 같은 것이 보인다. 이 책에서는 이런 현상을 Hermite cubic을 사용하여 보간을 더욱 세세하게 한다.

차이가 많이 안나지만 그림을 조금 더 자세하게 봤을 때 경계 부분이 조금 더 흐릿하게 이루어진 것을 확인할 수 있다.
noise에 대한 scale을 추가해서 조금 더 high frequency를 가지는 perlin texture를 만들어 보자.

texture를 봤을 때 아직 까지도 블럭화를 확인 할 수 있다. perlin은 격자로 되는 지점에서 random한 unit vector를 두고 내적하여 latrttice point를 옮기는 것이다.

매우 자주 여러 개의 frequency를 가진 noise가 사용된다. 이것을 보통 turbulence라고 불리며, Noise에 대한 반복적인 호출의 합이다.

위의 turbulence는 간접적으로 사용이 된다. 예를 들어서 대리석 같은 texture 질감을 표현할 때 주로 사용이 된다. (실제로 봐도 대리석 무늬같다.) 기본적인 아이디어는 sin함수같은 것과 같이 비례하는 color값을 가지게 하는 것이다. 그리고 turblence를 이용하여 줄무늬 같은 모양을 표면에 맞추는 방법이다.

여기까지 Perlin noise를 이용한 texture를 작성했다. 이제 perlin Noise라는 것이 정말 무엇인지 알아보자.

출처: https://en.wikipedia.org/wiki/Perlin_noise

Perlin Noise

perlin이라는 사람이 만든 일종의 noise이다. 그래서 영화 시각 효과의 컴퓨터 생성 표면에 자연스러운 texture를 만드는 데 사용되는 기술이라고 한다. perlin noise는 procdural texture primitive로, 컴퓨터 그래픽에서 사실감을 높이는 gradient noise이다. 그래서 그래픽스 분야에서 보편적으로 사용되고 있다.

perlin Noise Alogorithm

먼저 perlin noise는 일반저긍로 2, 3, 4차원 함수로 구현되지만 임의의 차원에 대해 정의 할 수 있다. 구현에는 일반적으로 random gradient vector의 grid를 정의하고 다음 gradient vector와 그 offset을 내적하는 것을 계산하며 그 값들 사이의 interpolation을 진행한다.

무슨 소리지...? 일단 조금 더 보자.

  • 먼저, random gradient vector의 grid를 정의한다고 했다.

    위의 사진처럼 고정된 random n-차원의 unit-length gradient vector와 연관 된 각 grid intersection으로 이루어진 n-차원의 grid를 정의한다. 즉, 더 쉽게 말하자면 각 grid intersection에서 unit vector들이 존재할 것이다. 그것들을 가지고 n-차원의 grid를 정하는 것이다. 하지만 1차원 상황에서 gradients가 -1 과 1 사이의 random scalar 값이라면 제외 시킨다.

  • Dot product gradient vector, offset

    grid안의 작은 사각형을 예시로 하겠다. 먼저 사각형 안에서 랜덤하게 candidate point(후보 점)를 지정하게 된다. 그러면 그 candidate point와 4개의 grid안의 작은 사각형 모서리의 점을 이용하여 vector를 각각 구해낸다. 그리고 그 vector와 앞서 우리가 각각의 grid 사각형 모서리에서 random하게 생성된 gradient vector를 내적을 계산한다. gradient vector 의 influence는 거리에 따라 커지며 offset의 vector를 unit vector로 만들게 된다면 이를 방지할 수 있다.

    즉, 작은 grid 사각형 안에서 점을 random으로 두고 그 점에 대해서 각 모서리와의 vector를 구해낸다. 그리고 각 모서리에서 새로 구해진 vector와 기존에 random하게 만든 gradient vector를 내적한다는 소리이다.

  • interpolation

    위의 식에서 내적을 진행하여 각 모서리에는 내적한 값을 가지고 있다. 그 값으로 interpolation을 진행하는 것이다. interpolation을 하는 방법은 여러가지가 있어 상황에 맞게 사용하면 된다. 우리가 배우는 책에서는 Hermite cubic interpolation을 사용했다.

Hermite cubic interpolation graph


지형을 만들어 낼 때 자연스럽게 만들 수 있는 좋은 noise라고 한다. 진짜 어렵지만 나중에 복습을 한번 더하자...

profile
안녕하세요!

0개의 댓글