ddx (hlsl)는 실제로 무엇을합니까? 어떻게 될지 상상할 수

조금 혼란 스러워요. 공식 문서 ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx )에 따르면 ddx (input)은 입력과 관련하여 부분적으로 파생 된 것입니다 “화면 공간 x 좌표”

내 미적분은 괜찮지 만 입력이 무엇인지 어떻게 알 수 있습니까? 함수에 전달하면 어떻게 될지 상상할 수 있지만 숫자의 미분은 항상 0입니다 …?

스케일링입니까? 예를 들어, 이것은이 거리에서 크기의 10 분의 1로 스케일링되어 1 분의 1을 반환합니까? 그러나 입력이 필요하지 않습니다 …

누군가 실제로 무슨 일이 일어나고 있는지에 대한 간단한 설명을 해 줄 수 있습니까?



답변

내부적으로 GPU는 한 번에 하나의 픽셀 쉐이더 인스턴스를 실행하지 않습니다. 최고의 세분성 수준에서 SIMD 아키텍처를 사용하여 항상 동시에 32-64 픽셀을 실행합니다. 이 범위 내에서 픽셀은 2×2 쿼드로 추가 구성되므로 SIMD 벡터에서 4 개의 연속 픽셀 그룹은 화면의 2×2 픽셀 블록에 해당합니다.

파생은 쿼드의 픽셀 간 차이를 계산하여 계산됩니다. 예를 들어, ddx오른쪽의 값에서 쿼드 왼쪽의 픽셀 값을 ddy빼고 위쪽 픽셀에서 아래쪽 픽셀을 뺍니다. 그런 다음 차이를 쿼드의 4 개 픽셀 모두에 대한 미분으로 반환 할 수 있습니다.

픽셀 셰이더가 SIMD에서 실행 중이므로 해당 값이 쿼드의 모든 픽셀에 대해 동일한 레지스터에 동시에 보장됩니다. 그래서 어떤 표현이나 넣어 값 ddx또는 ddy상기 한 바와 같이,이 쿼드의 네 픽셀 단위로 평가됩니다 후 다른 픽셀의 값을 뺀.

따라서 상수 값의 미분을 취하면 4 개의 픽셀 모두에서 동일한 상수 값이기 때문에 (미적분학에서 알 수 있듯이) 영점을 얻습니다.

또한 “거친”및 “미세한”파생물 인 ddx_coarse/ ddy_coarseddx_fine/가 ddy_fine있습니다. 차이점에 대한 설명은 여기에 있습니다 . 일반 버전의 일반 ddx/ ddy별칭입니다.

BTW,이 기능이 존재하는 이유는 밉맵 선택 및 이방성 필터링을 수행하기 위해 GPU가 내부적으로 파생 된 텍스처 좌표를 가져야하기 때문입니다. 하드웨어에는 어쨌든 기능이 필요하기 때문에 (쉐이더에서 텍스처 좌표에 임의의 표현을 사용할 수 있음)이를 셰이더 프로그래머에게 직접 노출시키는 것도 쉬웠습니다.