ddx (hlsl)는 실제로 무엇을합니까?


17

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

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

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

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


2
ddx그리고 ddy당신이 스스로 할 수없는 마법을한다. 픽셀 셰이더 내에서 얻을 수없는 래스터 화 파이프 라인의 추가 정보에 액세스 할 수 있습니다. 어떤 수식을 사용하는지 정확히 모르겠습니다. 나는 그들이 추정 기술을 사용한다고 믿게되었지만 확실하지 않습니다.
Sean Middleditch

매우 이상하지만 여전히 그렇습니다. ddx (5)는 실제로 무엇을 나타 냅니까? .1이라고하면 어떻게 해석해야합니까? 아니면 -6?
Richard Rast

1
ddx(5)무의미합니다. 입력 값과 함께 사용하면 블록의 인접 픽셀과 관련하여 해당 값의 미분을 제공합니다. 다시 말하지만, 얼마나 정확하게 값을 계산하는지는 모르지만 입력되지 않은 파생 값을 요구하는 것은 정의되지 않은 동작 일뿐 아니라 쓰레기를 생성 할 수 있습니다. 내가 제공 할 수있는 것보다 자세한 내용 은 fgiesen.wordpress.com/2011/07/10/… 을 참조하십시오 .
Sean Middleditch

확실하지는 않지만 HLSL 컴파일러가 실제로 ddx / ddy에 전달하는 식을 완전히 상징적으로 구별하고 있다는 것이 잘 될 수 있습니다. blogs.msdn.com/b/chuckw/archive/2011/03/08/… research.microsoft.com/pubs/146019/…
Ziriax

무엇을합니까? 분명히 약간 합리적인 것.
MickLH

답변:


32

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

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

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

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

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

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


+1; 텍스처에 섭동 효과를 적용 할 때 유용한 것으로 나타났습니다. 교란 된 texcoords는 약간의 색상 왜곡을 주지만, 원래의 교란되지 않은 texcoords의 파생물과 함께 tex2Dgrad를 사용하면 왜곡되지 않은 결과를 얻었습니다.
Maximus Minimus

좋아, 몇 가지 생각 후에 나는 내 혼란을 알아 낸 것 같아요. 제 생각 ddx에는 전통적인 프로그래밍 언어에서 다른 모든 기능과 같이 작동합니다. 입력을 평가하여 부동 소수 점수로 바꾸고 나서 외부 함수 ( ddx)를 수행하십시오. 그러나 이것은 다릅니다-입력 문자열을 가져 와서 여러 곳에서 평가하고 미분을 계산하고 결과를보고합니다. 그게 맞습니까?
Richard Rast

1
@RichardRast 맞아. value 대신 전달 ddx하는 표현식 을 조작하는 것으로 생각할 수 있습니다 .
Nathan Reed

그러나 문서에 있어야 할 정도로 이상합니다. 나는 프로그래밍 생활에서 그럴 때가 아니라고 생각할 수있다.
Richard Rast

Nathan Reed는 GPU가 밉맵 선택에이 기능을 사용한다고 언급했습니다. 또한이를 사용하여 GPU가 원하는 밉맵 레벨을 선택하거나 아티팩트가 잘못된 밉 레벨 선택을 방지하도록 할 수 있습니다. 이 프로세스는 Shader X3의 163 및 164 페이지에 설명되어 있습니다.
JamesHoux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.