Noise
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
Other References:
Perlin Noise - Scratchpixel 2.0
Understanding Perlin Noise - adrian’s soapbox
Perlin Noise
일반적으로 noise하면 떠오르는 Value Noise의 경우 격자 모서리에 난수를 생성한 뒤 해당 값들을 interpolation하여 사용한다. 반면 이번에 다룰 perinl Noise의 경우 격자 모서리에 난수를 생성하는 것이 아니라 난수를 이용한 gradient vector를 생성한다. 아래 내용은 1-D일 때 perlin noise가 value noise보다 좋은 이유를 간단히 설명한 것이다.
Ideal Noise | Value Noise(Bad Case) | Perlin Noise(Bad Case) |
---|---|---|
- 이상적인 noise는 국소적으로 부드럽게 변하지만, 전체적으로는 균일한 모습을 보임
- value noise의 경우 주변 값에 따라 주파수가 들쭉날쭉하게 됨
- 차이가 적은 경우 낮은 주파수
- 차이가 큰 경우 높은 주파수
- 반면 perlin noise의 경우 gradient가 어느 방향을 나타내느냐는 크게 중요하지 않음
- 전체적으로 균일한 S자 모양의 형태를 나타냄
Step 1 | Step 2 | Step 3 |
---|---|---|
- 입력 좌표가 포함된 격자 위치 구하기
- 격자 모서리에 저장된 gradient vector 가져오기
- gradient vector와, distance vector(모서리-입력좌표) 내적
- 4개의 내적 결과를 interpolation.
- 이때 noise를 부드럽게 하기 위해, linear interpolation이 아닌 부드러운 곡선으로 interpolation.
- ex) 6(t^5) - 15(t^4) + 10(t^3)
Result
- 파랑/노랑 = 양수/음수
Curl Noise
앞서 배운 SPH나 Stable Fluid은 모두 “Incompressible” 하다는 유체의 특성을 이용해 계산했다. Stable Fluid는 입자마다 속도 벡터를 계산하는 것이 아닌, 공간에 대한 정보인 Vector Field를 계산해 효율성을 높였다. Vector Field를 기준으로 계산을 하게 되면 Texture 형태의 자료구조를 이용할 수 있고, 주변 공간에 대한 정보를 바로 알 수 있기 때문에 shader를 이용한 병렬 처리가 가능하다. 하지만 여전히 많은 연산을 필요로 한다.
Vector Calculus 수업을 들을 때 임의의 벡터장의 curl의 divergence는 항상 0이라는 내용을 배웠었다. 이 말인 즉, “노이즈로 curl을 만들고 이를 속도장으로 사용한다면 유체와 비슷한 효과가 나지 않을까?” 라는 발상이 가능하다는 것이다. 실제로 특수효과를 제작할 때 간단한 모델로 시뮬레이션을 돌리고, 노이즈를 이용해 디테일을 추가하는 방식이 정석이라고 한다.
댓글 남기기