페를린 노이즈

Perlin noise
z=0에서 3D Perlin 노이즈를 통한 2차원 슬라이스

Perlin 노이즈는 Ken Perlin에 의해 개발경사 노이즈입니다.

역사

Ken Perlin은 1983년 당시 [1]컴퓨터 생성 이미지(CGI)의 "머신 같은" 모습에 불만을 느낀 결과 Perlin 노이즈를 개발했습니다.그는 1985년 SIGGRAPH 논문에 An Image [2]Synthizer라는 자신의 연구 결과를 공식적으로 기술했다.그는 애니메이션 회사 [3]MAGI에서 디즈니의 컴퓨터 애니메이션 공상과학 영화 Tron (1982)을 작업한 후 그것을 개발했다.1997년 Perlin은 다음과 [4][5][6][7]같은 알고리즘을 만든 공로로 아카데미 테크니컬 어워드(Technical Award for Technical Achievement)를 수상했습니다.

Ken Perlin에게 Perlin Noise의 개발은 영화 시각 효과의 컴퓨터 생성 표면에 자연스러운 텍스처를 만드는 데 사용되는 기술입니다.Perlin Noise의 개발로 컴퓨터 그래픽 아티스트는 영화 산업의 시각 효과에서 자연 현상의 복잡성을 더 잘 표현할 수 있게 되었습니다.

Perlin은 알고리즘에 관한 특허를 출원하지 않았지만 2001년에 텍스처 합성심플렉스 노이즈의 3D+ 구현에 관한 특허를 취득했습니다.심플렉스 노이즈의 용도는 동일하지만 공간 채우기 그리드를 사용합니다.심플렉스 노이즈는 Perlin의 "클래식 노이즈"에 대한 문제를 완화하며, 그 중 계산 복잡성과 시각적으로 중요한 방향 [8]아티팩트를 포함합니다.

사용하다

Perlin 노이즈를 사용하여 생성된 가상 환경

펄린 노이즈는 프로시저 텍스처 프리미티브로 시각 효과 아티스트가 컴퓨터 그래픽에서 사실감을 높이기 위해 사용하는 그라데이션 노이즈입니다.함수는 의사 임의 모양을 가지지만 시각적 세부 사항은 모두 크기가 동일합니다.이 속성을 통해 쉽게 제어할 수 있습니다. Perlin 노이즈의 여러 축척 복사본을 수학식에 삽입하여 다양한 절차 텍스처를 만들 수 있습니다.Perlin 노이즈를 사용한 합성 텍스처는 CGI에서 자주 사용되며 자연에서 텍스처의 제어된 랜덤한 외관을 모방함으로써 객체 표면, 불, 연기, 구름 등의 컴퓨터 생성 시각적 요소를 보다 자연스럽게 보이게 합니다.

Perlin 노이즈로 생성된 유기 표면

또한 데모 등 메모리가 극도로 제한될 때 텍스처를 생성하기 위해 자주 사용됩니다.프랙탈 노이즈와 심플렉스 노이즈와 같은 후속 제품은 모든 종류의 컴퓨터 그래픽스에서 실시간 그래픽스 및 비실시간 프로시저 텍스처 모두에서 그래픽 처리 장치에 거의 보편적으로 사용되고 있습니다.

비디오 게임에서 절차적으로 생성된 지형을 자연스럽게 만들기 위해 자주 사용됩니다.

알고리즘 상세

Perlin 노이즈의 스케일이 변경되어 프랙탈 노이즈가 생성되었습니다.

페를린 노이즈는 일반적으로 2차원, 3차원 또는 4차원 함수로 구현되지만 임의의 수의 차원에 대해 정의할 수 있습니다.구현에는 일반적으로 랜덤 구배 벡터의 격자를 정의하고, 구배 벡터와 그 오프셋 사이의 점곱을 계산하며, 이들 값 사이의 보간법이 포함됩니다.[9]

그리드 정의

그라데이션 벡터의 2차원 그리드

각 그리드 교차점이 고정 랜덤 n차원 단위 길이 구배 벡터와 연관된 n차원 그리드를 정의합니다. 단, 구배가 -1과 1 사이의 무작위 스칼라인 1차원의 경우는 제외한다.

도트 제품

그리드 노드 그라데이션 값이 가장 가까운 각 점의 도트 곱.셀에 다른 3개의 노드가 있는 도트 곱은 표시되지 않습니다.

후보 점의 값을 계산하려면 먼저 점이 위치한 고유한 그리드 셀을 찾습니다.그런 다음 해당 셀의 2 모서리와 관련된 구배 벡터를 식별합니다.그런 다음 각 모서리에 대해 오프셋 벡터를 계산합니다.오프셋 벡터는 후보점에서 해당 코너까지의 변위 벡터입니다.

각 모서리에 대해 점곱을 그라데이션 벡터와 오프셋 벡터 사이에 두고 후보 지점으로 이동합니다.후보점이 정확히 그리드 모서리에 있는 경우 이 도트 곱은 0이 됩니다.

기울기 벡터의 영향은 거리에 따라 커지며, 오프셋 벡터를 1{\1) 길이로 정규화하면 이를 방지할 수 있습니다.이는 다음 보간 단계에서 거리를 고려한다는 점을 제외하고 현저한 변화를 초래할 것이다.그러나 오프셋 벡터를 정규화하는 것은 일반적인 방법이 아닙니다.

2차원 그리드의 경우 4개의 오프셋 벡터와 도트 곱을 계산해야 하며, 3차원에서는 8개의 오프셋 벡터와 8개의 도트 곱을 계산해야 합니다.일반적으로 알고리즘의 O(O(2})입니다.서 nn은 차원수입니다.

보간법

최종 보간 결과

마지막 단계는 2 도트 제품 보간입니다.보간은 2 노드에서 제1도함수(및 제2도함수)가 0인 함수를 사용하여 수행된다.따라서 그리드 노드에 가까운 지점에서 출력은 노드의 그라데이션 벡터와 노드에 대한 오프셋 벡터의 닷 곱에 근사합니다.즉, 모든 노드에서 노이즈 함수가 0을 통과하여 Perlin 노이즈의 특성을 나타냅니다.

n n인 경우 그리드 노드 에서 값({ 그리드 노드 1에서 }) 사이에 보간하는 함수의 예는 다음과 같습니다.

smoothstep 기능이 사용되었습니다.

컴퓨터 그래픽에 사용되는 노이즈 함수는 일반적으로 [-1.0, 1.0] 범위의 값을 생성하며 그에 따라 크기를 조정할 수 있습니다.

실행

다음은 C로 작성된 Classical Perlin Noise의 2차원 구현입니다.

Perlin에 의한 최초의 레퍼런스 실장은 Java로 작성되었으며 주요 차이점은 다음과 같습니다.

  • 그것은 정사각형의 네 모서리 대신 입방체의 여덟 모서리 사이에 보간하여 입체적인 접근을 사용하고 있다.
  • 랜덤 구배 방향은 모서리 정수 좌표의 높은 회전 주파수에서 간섭을 사용하는 것보다 훨씬 빠른 정수 좌표의 비트를 혼합하고, 제품에 의해 높은 주파수로 다시 병합 및 회전시킨다: 회전은 균일하게 분포되지 않는다.
  • Perlin의 메서드는 정수 공간을 256x256x256 큐브로 분할한 후 이들 큐브의 랜덤 순열을 사용하여 셔플합니다.그 후 각 큐브 위치 모서리는 4x4x4 포장의 공간에서 인접한 비분산 큐브에 12개의 방향 중 하나가 할당됩니다.이것은 정수 연산만을 필요로 하지만 직접 분포의 균일한 분포를 유지합니다.이온.
  • 보간 기능은 기본 선형 단계가 아닌 보다 부드러운 4도 평활기 단계(클램핑 경계에서 처음 세 도함수가 0과 동일)입니다.이는 특히 표본 추출 모서리를 연결하는 꼭지점이나 대각선을 따라 가시적인 아티팩트를 회피한다. 여기서 결과는 가시적으로 이방성(원하는 백색 노이즈를 핑크 노이즈로 변화시킨다. 소음이 고체 결정을 생성하기 위해 사용된 경우, 빛에 완전히 검고 불투명하지 않지만 일부 디스크에서 부분적으로 투명하고 착색된다.관찰 방향).
#실패하다 <math.h>  /* a0과 a1 사이의 선형 보간 함수 * 무게 w는 [0.0, 1.0] 범위여야 합니다. */ 흘러가다 보간하다(흘러가다 a0, 흘러가다 a1, 흘러가다 w) {     /* // 다음을 삽입하여 클램핑을 원할 수 있습니다. * (0.0 > w)가 a0을 반환하는 경우; * (1.0 < w)가 a1을 반환하는 경우; */     돌아가다 (a1 - a0) * w + a0;     /* // 부드러운 외관을 위해 이 큐빅 보간[Smooth step]을 사용합니다. * 반환(a1 - a0) * (3.0 - w * 2.0) * w * w + a0; * * // 경계에서 두 번째 도함수가 0인 보다 부드러운 결과를 얻으려면 [Smootherstep]을 사용합니다. * 반환(a1 - a0) * ((w * 6.0 - 15.0) + 10.0) * w * w * w) + a0; */ }  유형화된 구조 {     흘러가다 x, y; } 벡터 2;  /* 의사 난수 방향 벡터 생성 */ 벡터 2 랜덤 그레이디언트(인트 ix, 인트 하지 않다) {     // 미리 계산된 그라데이션이 없다는 것은 그리드 좌표 수에 관계없이 작동함을 의미합니다.     컨스턴트 서명되어 있지 않다 w = 8 * 크기(서명되어 있지 않다);     컨스턴트 서명되어 있지 않다 s = w / 2; // 회전 폭     서명되어 있지 않다 a = ix, b = 하지 않다;     a *= 3284157443; b ^= a << > s   a >> w-s;     b *= 1911520717; a ^= b << > s   b >> w-s;     a *= 2048419325;     흘러가다 랜덤 = a * (3.14159265 / ~(~0u >> 1)); // [0, 2*Pi]의 경우     벡터 2 v;     v.x = 왜냐하면(랜덤); v.y = (랜덤);     돌아가다 v; }  // 거리 및 그라데이션 벡터의 도트 곱을 계산합니다. 흘러가다 dotGridGradient(인트 ix, 인트 하지 않다, 흘러가다 x, 흘러가다 y) {     // 정수 좌표에서 그라데이션 가져오기     벡터 2 구배 = 랜덤 그레이디언트(ix, 하지 않다);      // 거리 벡터 계산     흘러가다 dx = x - (흘러가다)ix;     흘러가다 dy = y - (흘러가다)하지 않다;      // 도트 제품의 계산     돌아가다 (dx*구배.x + dy*구배.y); }  // x, y 좌표에서의 Perlin 노이즈 계산 흘러가다 플린(흘러가다 x, 흘러가다 y) {     // 그리드 셀 좌표 결정     인트 x0 = (인트)바닥.(x);     인트 x1 = x0 + 1;     인트 y0 = (인트)바닥.(y);     인트 y1 = y0 + 1;      // 보간 가중치 결정     // 여기에 고차 다항식/s-곡선을 사용할 수도 있습니다.     흘러가다 sx = x - (흘러가다)x0;     흘러가다 시스템 = y - (흘러가다)y0;      // 그리드 포인트 그라데이션 간 보간     흘러가다 n0, n1, ix0, ix1, 가치;      n0 = dotGridGradient(x0, y0, x, y);     n1 = dotGridGradient(x1, y0, x, y);     ix0 = 보간하다(n0, n1, sx);      n0 = dotGridGradient(x0, y1, x, y);     n1 = dotGridGradient(x1, y1, x, y);     ix1 = 보간하다(n0, n1, sx);      가치 = 보간하다(ix0, ix1, 시스템);     돌아가다 가치; } 

치환

Perlin 노이즈의 많은 구현에서는 Ken Perlin이 [10]원래 구현에서 사용한 것과 동일한 치환 세트를 사용합니다.그 실장은 다음과 같습니다.

인트 치환[] = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36,                        103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0,                        26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56,                        87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166,                        77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55,                        46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132,                        187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109,                        198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126,                        255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183,                        170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43,                        172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112,                        104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162,                        241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106,                        157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,                        93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; 

이 특정 순열은 반드시 필요한 것은 아니지만 [0 ~255](포함) 값의 랜덤화 배열이 필요합니다.새 치환표를 작성할 경우 값의 [11]균일한 분포를 보장하도록 주의해야 합니다.

복잡성

노이즈 함수의 각 평가에 대해 위치 및 구배 벡터의 닷 곱은 포함하는 그리드 셀의 각 노드에서 평가되어야 한다.따라서 Perlin 노이즈는 O( {})}(nn}) 치수로 됩니다.Perlin 노이즈가 복잡도 스케일링을 개선하여 유사한 결과를 생성하는 대안으로는 Simplex 노이즈와 OpenSimplex 노이즈있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Perlin, Ken. "Making Noise". noisemachine.com. Ken Perlin. Archived from the original on October 8, 2007.
  2. ^ Perlin, Ken (July 1985). "An Image Synthesizer". SIGGRAPH Comput. Graph. 19 (97–8930): 287–296. doi:10.1145/325165.325247.
  3. ^ Perlin, Ken. "In the beginning: The Pixel Stream Editor" (PDF). Retrieved May 31, 2022.{{cite web}}: CS1 maint :url-status (링크)
  4. ^ Tanner, Mike. "Oscar is FX Wizard's Reward". Wired. ISSN 1059-1028. Retrieved 2022-05-31.
  5. ^ 원본 소스 코드
  6. ^ 2018-05-01 Ken Perlin의 '커런트 노이즈 기능' Wayback Machine에 보관
  7. ^ Gustavson, Stefan. "Simplex noise demystified" (PDF). Retrieved 24 April 2019.
  8. ^ 미국 특허 686776, Kenneth Perlin, "Perlin 노이즈에 대한 표준", 2005-03-15 발행, Kenneth Perlin and Wsou Investments LLC에 할당
  9. ^ Gustavson, Stefan. "Simplex noise demystified" (PDF). Retrieved 24 April 2019.
  10. ^ Perlin, Ken. "Perlin noise". Retrieved 26 August 2020.
  11. ^ "Perlin Noise: Part 2". Retrieved 26 August 2020.

외부 링크