전적으로 기술적 인 용어 fwidth(p)
로
fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))
그리고 dFdx(p)
/ dFdy(p)
값의 부분 도함수이다 p
받는 대하여 x
및 y
화면 사이즈. 따라서 p
하나의 픽셀을 오른쪽 ( x
)으로 이동하거나 하나의 픽셀을 위쪽으로 이동 ( y
) 할 때 의 값 동작 을 나타냅니다 .
이제 어떻게 실제로 계산할 수 있습니까? 에 대한 이웃 픽셀의 값을 아는 경우 실제 수학적 미분에 대한 근사치 와 같은 정확한 유한 차이 로 p
파생 값을 계산할 수 있습니다 (정확한 분석 솔루션이 없을 수도 있음).
dFdx(p) := p(x+1) - p(x)
그러나 물론 지금 당신은 요청할 수 있습니다. 우리 p
는 이웃 픽셀에 대한 값 (어쨌든 쉐이더 프로그램 내에서 임의로 계산 된 값 일 수 있음)을 어떻게 알 수 있습니까? 전체 셰이더 계산을 두 번 (또는 세 번) 수행하여 주요 오버 헤드를 발생시키지 않고 이러한 값을 어떻게 계산합니까?
이웃 픽셀에 대해서도 조각 쉐이더를 실행하기 때문에 어쨌든 이웃 값이 계산되는 것을 알고 있습니다. 따라서 이웃 픽셀에 대해 실행할 때이 이웃 조각 셰이더 호출에 액세스하기 만하면됩니다. 그러나 인접한 값도 동시에 계산되기 때문에 훨씬 쉽습니다.
현대의 래스터 라이저는 하나 이상의 인접 픽셀로 이루어진 더 큰 타일에서 조각 쉐이더를 호출합니다. 가장 작은 것은 2x2 격자의 픽셀입니다. 그리고 이러한 각 픽셀 블록에 대해 조각 쉐이더가 각 픽셀에 대해 호출되고 호출 은 완벽하게 병렬 잠금 단계로 실행 되므로 모든 계산이 블록의 각 픽셀에 대해 동일한 순서로 정확하게 수행됩니다. (따라서 블록을 호출 할 때마다 호출이 발생하더라도 최소한 한 번의 호출로 수행되는 모든 브랜치를 탐색해야하기 때문에 프래그먼트 셰이더의 브랜칭은 치명적이지는 않지만 피해야하는 이유입니다. 이 관련 질문 에 대한 답변에서 알 수 있듯이 이후의 결과). 따라서 조각 쉐이더는 이론적으로 인접 픽셀의 조각 쉐이더 값에 액세스 할 수 있습니다. 당신이 그 값에 직접 액세스 할 수없는 동안, 당신은 파생 기능과 같은 그들로부터 계산 된 값에 대한 액세스 권한을 가지고 dFdx
, dFdy
, fwidth
, ...
dFdx(p) = p(x1) - p(x)
, 다음x1
이 될 수(x+1)
또는(x-1)
화소의 위치에 따라,x
쿼드있다. 어느 쪽이든x1
,와 같은 워프 / 파면에 있어야합니다x
. 제가 맞습니까?