너비 란 무엇이며 어떻게 작동합니까?


18

의 OpenGL 문서는 그 fwidth을 말한다 returns the sum of the absolute value of derivatives in x and y.

이것은 수학적으로 덜 의미하는 것을 의미하며 그것을 시각화하는 방법이 있습니까?

함수에 대한 나의 이해를 바탕으로 이웃 픽셀 fwidth(p)의 값에 액세스 할 p수 있습니다. 성능에 큰 영향을 미치지 않으면 서 GPU에서 어떻게 작동하며 모든 픽셀에서 안정적으로 균일하게 작동합니까?

답변:


18

픽셀 화면 공간 파생물 성능에 큰 영향을 주지만 사용 여부에 관계없이 성능에 영향을 미치므로 특정 관점에서 볼 때 무료입니다!

최근 기록에있는 모든 GPU는 4 개의 픽셀 4 개를 모아서 같은 워프 / 웨이브 프론트에 넣습니다. 이는 GPU에서 서로 바로 실행되므로 값을 액세스하는 것이 매우 저렴하다는 것을 의미합니다. 날실 / 파면은 잠금 단계로 실행되므로 다른 픽셀도 셰이더에서 정확히 같은 위치에있게되므로 p해당 픽셀 의 값은 사용자 를 기다리는 레지스터에 저장됩니다. 다른 3 개의 픽셀은 결과가 사라지더라도 항상 실행됩니다. 따라서 단일 픽셀을 덮는 삼각형은 항상 4 개의 픽셀을 음영 처리하고 3 개의 결과를 버립니다. 이러한 파생 기능이 작동합니다!

fwidth파생물을 사용하는 것과 같은 기능이 아니기 때문에 (현재 하드웨어의 경우) 수용 가능한 비용으로 간주됩니다. 텍스처의 밉맵을 읽을 수 있도록 모든 단일 텍스처 샘플도 마찬가지입니다. 표면에 매우 가까운 경우, 텍스처를 샘플링하는 데 사용하는 UV 좌표는 화면 공간에서 매우 작은 파생물을 가지므로 더 큰 밉맵을 사용해야하며 UV 좌표가 더 멀면 화면 공간에서 더 큰 파생물, 더 작은 밉맵을 사용해야 함을 의미합니다.

수학적 용어가 적은 의미 fwidth는 다음과 같습니다 abs(dFdx(p)) + abs(dFdy(p)). dFdx(p)는 단순히 p픽셀 x + 1에서의 값과 픽셀 x에서 의 값 사이의 차이 p이며, 마찬가지로 유사하다 dFdy(p).


그래서, 만약 dFdx(p) = p(x1) - p(x), 다음 x1이 될 수 (x+1)또는 (x-1)화소의 위치에 따라, x쿼드있다. 어느 쪽이든 x1,와 같은 워프 / 파면에 있어야합니다 x. 제가 맞습니까?
ApoorvaJ

3
@ApoorvaJ 본질적으로 동일한 값 dFdx이 2x2 격자의 2 개의 인접 픽셀 각각에 대해 계산됩니다. 그리고이 값은 두 이웃 값의 차이를 사용하여 계산됩니다. 단지 p(x+1)-p(x)또는 여기에 정확히 p(x)-p(x-1)무엇이 있는지에 따라 다릅니다 x. 그러나 결과는 같습니다. 네 맞습니다.
Chris는 Reinstate Monica가

@ChristianRau 그건 내 질문에 대답합니다. 감사.
ApoorvaJ

11

전적으로 기술적 인 용어 fwidth(p)

fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))

그리고 dFdx(p)/ dFdy(p)값의 부분 도함수이다 p받는 대하여 xy화면 사이즈. 따라서 p하나의 픽셀을 오른쪽 ( x)으로 이동하거나 하나의 픽셀을 위쪽으로 이동 ( y) 할 때 의 값 동작 을 나타냅니다 .

이제 어떻게 실제로 계산할 수 있습니까? 에 대한 이웃 픽셀의 값을 아는 경우 실제 수학적 미분에 대한 근사치 같은 정확한 유한 차이p파생 값을 계산할 수 있습니다 (정확한 분석 솔루션이 없을 수도 있음).

dFdx(p) := p(x+1) - p(x)

그러나 물론 지금 당신은 요청할 수 있습니다. 우리 p는 이웃 픽셀에 대한 값 (어쨌든 쉐이더 프로그램 내에서 임의로 계산 된 값 일 수 있음)을 어떻게 알 수 있습니까? 전체 셰이더 계산을 두 번 (또는 세 번) 수행하여 주요 오버 헤드를 발생시키지 않고 이러한 값을 어떻게 계산합니까?

이웃 픽셀에 대해서도 조각 쉐이더를 실행하기 때문에 어쨌든 이웃 값이 계산되는 것을 알고 있습니다. 따라서 이웃 픽셀에 대해 실행할 때이 이웃 조각 셰이더 호출에 액세스하기 만하면됩니다. 그러나 인접한 값도 동시에 계산되기 때문에 훨씬 쉽습니다.

현대의 래스터 라이저는 하나 이상의 인접 픽셀로 이루어진 더 큰 타일에서 조각 쉐이더를 호출합니다. 가장 작은 것은 2x2 격자의 픽셀입니다. 그리고 이러한 각 픽셀 블록에 대해 조각 쉐이더가 각 픽셀에 대해 호출되고 호출 은 완벽하게 병렬 잠금 단계로 실행 되므로 모든 계산이 블록의 각 픽셀에 대해 동일한 순서로 정확하게 수행됩니다. (따라서 블록을 호출 할 때마다 호출이 발생하더라도 최소한 한 번의 호출로 수행되는 모든 브랜치를 탐색해야하기 때문에 프래그먼트 셰이더의 브랜칭은 치명적이지는 않지만 피해야하는 이유입니다. 이 관련 질문 에 대한 답변에서 알 수 있듯이 이후의 결과). 따라서 조각 쉐이더는 이론적으로 인접 픽셀의 조각 쉐이더 값에 액세스 할 수 있습니다. 당신이 그 값에 직접 액세스 할 수없는 동안, 당신은 파생 기능과 같은 그들로부터 계산 된 값에 대한 액세스 권한을 가지고 dFdx, dFdy, fwidth, ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.