스무스텝

Smoothstep
0을 왼쪽 가장자리로, 1을 오른쪽 가장자리로 사용하여 평활 단계(x)와 평활기 단계(x) 함수의 그림

스무스텝컴퓨터 그래픽,[1][2] 비디오 게임 엔진,[3] 머신러닝 등에 흔히 쓰이는 시그모이드 모양의 보간클램핑 기능의 계열이다.[4]

함수는 입력 x, "좌측 에지" 및 "우측 에지"의 세 파라미터에 따라 달라지며, 왼쪽 에지는 오른쪽 에지보다 작다고 가정한다.함수는 인수로 실제 숫자 x를 수신하고 x가 왼쪽 가장자리보다 작거나 같으면 0을 반환하고, x가 오른쪽 가장자리보다 크거나 같으면 1을 반환하며, 그렇지 않으면 헤르미테 다항식을 사용하여 0과 1 사이에 부드럽게 보간한다.스무드스텝 함수의 구배는 양쪽 가장자리 모두 0이다.이는 보다 정교하거나 값비싼 보간 기법을 사용하는 대신 매끄러운 단계를 사용하여 각 세그먼트를 보간하는 일련의 전환을 만들 때 편리하다.

HLSL에서 은 S ( x) 클램핑Hermite 보간 입방체를 구현한다.

왼쪽 가장자리가 0이라고 가정할 때 오른쪽 가장자리는 1이며, 가장자리 사이의 전환은 0 x x ≤ 1에서 이루어진다.

AMD가[5] 제공하는 C/C++ 구현 예는 다음과 같다.

둥둥 뜨다 매끄러운 걸음걸이 (둥둥 뜨다 에지0, 둥둥 뜨다 가장자리1, 둥둥 뜨다 x) {    만일 (x < 에지0)       돌아오다 0;     만일 (x >= 가장자리1)       돌아오다 1;     // [0..1] 범위로 스케일/바이어스 조정    x = (x - 에지0) / (가장자리1 - 에지0);     돌아오다 x * x * (3 - 2 * x); } 

다시 왼쪽 가장자리가 0이고 오른쪽 가장자리가 1이라고 가정하면 부드러운 스텝을 위한 일반적인 형태는 다음과 같다.

( ) 은(는) 클램핑 기능과 동일함:

특성 "" 모양의 S자형 곡선은 정수 n n 1에 대해서만 S ( x) {S} _)}를 사용하여 구한다.일반 스무스텝에서 다항식의 순서는 2n + 1이다.n = 1인 경우, 평탄한 스텝의 기울기나 첫 번째 파생상품은 왼쪽과 오른쪽 가장자리(x = 0, x = 1)에서 0과 같으며, 여기서 곡선은 상수 또는 포화 수준에 추가된다.정수 n이 높을수록 두 번째 및 상위 파생상품은 가장자리에 0이 되어 다항식 함수가 가능한 한 평평하고 한계값인 0 또는 1에 스플라이스가 더 부드럽다.

변형

켄 펄린은 일반 형태의 두 번째 순서에 해당하는, 일반적으로 사용되는 1차 순서의 매끄러운 단계 함수의 개선된 버전을 제안했다[6].1차 및 2차 파생상품x = 0, x = 1:

C/C++ 참조 구현:

둥둥 뜨다 매끄러운 걸음걸이(둥둥 뜨다 에지0, 둥둥 뜨다 가장자리1, 둥둥 뜨다 x) {   // 스케일링 및 클램프 x ~ 0..1 범위   x = 옭아매다((x - 에지0) / (가장자리1 - 에지0), 0.0, 1.0);   // 다항식 평가   돌아오다 x * x * x * (x * (x * 6 - 15) + 10); }  둥둥 뜨다 옭아매다(둥둥 뜨다 x, 둥둥 뜨다 하한선, 둥둥 뜨다 상행선) {   만일 (x < 하한선)     x = 하한선;   만일 (x > 상행선)     x = 상행선;   돌아오다 x; } 

기원

3차 방정식

일반적인 3차 다항식 함수와 첫 번째 파생 모델부터 시작:

두 엔드포인트에서 함수에 대해 원하는 값 적용:

두 엔드포인트에서 함수의 첫 번째 파생 모델에 원하는 값 적용:

마지막 4개의 방정식으로 형성된 4개의 미지의 시스템을 풀면 다항식 계수의 값이 된다.

이에 따라 3차 "스무스텝" 기능은 다음과 같다.

5차 방정식

일반적인 5차 다항식 함수로 시작하여 첫 번째 파생 모델 및 두 번째 파생 모델:

두 엔드포인트에서 함수에 대해 원하는 값 적용:

두 엔드포인트에서 함수의 첫 번째 파생 모델에 원하는 값 적용:

두 엔드포인트에서 기능의 두 번째 파생상품에 대해 원하는 값 적용:

마지막 6개의 방정식에 의해 형성된 6개의 미지의 시스템을 풀면 다항식 계수의 값이 된다.

따라서 5차 "smootherstep" 기능은 다음과 같다.

7차 방정식

유사한 기법을 적용하여 7차 방정식은 다음과 같은 것으로 밝혀졌다.

고차 방정식에 대한 일반화

매끄러운 단계 다항식은 일반화되며, 0 ≤ x ≤ 1은 다음과 같다.

여기서 N은 결과 다항 함수의 순서를 결정하는데, 이 함수는 2N + 1이다.0 smooth x ≤ 1을 가진 처음 7개의 매끄러운 단계 다항식은

0에서 1로 x가 전환될 때 0에서 1로 전환되는 부드러운 스텝 다항식 () 을(를) 홀수 대칭 다항식으로 간단히 매핑할 수 있음을 알 수 있다.

어디에

그리고

RN(x)의 인수는 -1 ≤ x ≤ 1이며, 왼쪽의 상수 -1, 오른쪽의 +1에 추가된다.

Javascript에서 ( ) 구현:[7]

// 일반화 스무스텝 기능을 하다 일반 SmoothStep(N, x) {   x = 옭아매다(x, 0, 1); // x는 0과 1 사이 또는 같아야 함   시합을 하다 결과 = 0;   을 위해 (시합을 하다 n = 0; n <= N; ++n)     결과 += 파스칼트라이앵글(-N - 1, n) *               파스칼트라이앵글(2 * N + 1, N - n) *               수학.포우(x, N + n + 1);   돌아오다 결과; }  // 요인 사용 없이 이항 계수를 반환합니다, // 음의 정수로 사용할 수 없는 것 기능을 하다 파스칼트라이앵글(a, b) {   시합을 하다 결과 = 1;    을 위해 (시합을 하다 i = 0; i < b; ++i)     결과 *= (a - i) / (i + 1);   돌아오다 결과; }  기능을 하다 옭아매다(x, 하한선, 상행선) {   만일 (x < 하한선)     x = 하한선;   만일 (x > 상행선)     x = 상행선;   돌아오다 x; } 

반반 평활 스텝

스무드스텝()의 역방향은 그 효과를 되돌리거나 보상할 필요가 있을 때 컴퓨터 그래픽에서 특정 연산을 할 때 유용할 수 있다.3차 방정식의 경우 역에 대한 분석 솔루션이 존재하는데, 다음과 같다.

This arises as the inverse of , whose Maclaurin series terminates at , meaning (와) }는 같은 기능을 나타낸다.반면에 역행의 직렬 팽창은 종료되지 않는다.

GLSL의 경우:

둥둥 뜨다 역_역스텝(둥둥 뜨다 x) {   돌아오다 0.5 - 죄를 짓다(asin(1.0 - 2.0 * x) / 3.0); } 

참조

  1. ^ Microsoft Developer Network에서 원활한 작업 수행.
  2. ^ GLSL 언어 규격 버전 1.40.
  3. ^ Unity 게임 엔진 SmoothStep 설명서.
  4. ^ Hazimeh, Hussein; Ponomareva, Natalia; Mol, Petros; Tan, Zhenyu; Mazumder, Rahul (2020). The Tree Ensemble Layer: Differentiability meets Conditional Computation (PDF). International Conference on Machine Learning. PMLR.
  5. ^ Natalya Tatarchuk (2003). "Advanced Real-Time Shader Techniques". AMD. p. 94. Retrieved 2022-04-16.
  6. ^ 텍스처링모델링, 제3판: 절차적 접근법.
  7. ^ 일반 스무스텝 방정식.

외부 링크