Jestem nieco zdezorientowany. Oficjalna dokumentacja ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx ) mówi, że ddx (dane wejściowe) jest częściową pochodną danych wejściowych w odniesieniu do „współrzędnej x przestrzeni ekranu”.
Mój rachunek różniczkowy jest w porządku, ale jak rozpoznać, skąd pochodzi dane wejściowe? Gdybym podał jej funkcję, dobrze, mogę sobie wyobrazić, co by to zrobił, ale pochodna liczby jest zawsze równa zero ...?
Czy to tylko skalowanie? Na przykład, skalowałby się do jednej dziesiątej swojego rozmiaru w tej odległości, więc zwraca jedną dziesiątą? Ale wtedy nie potrzebuje danych wejściowych ...
Czy ktoś może szybko wyjaśnić, co się właściwie dzieje?
ddx
iddy
róbcie magię, której nie możecie zrobić sami. Mają dostęp do dodatkowych informacji z potoku rasteryzacji, których nie można uzyskać z poziomu modułu cieniującego piksele. Nie jestem pewien, jakiej dokładnie używają formuły; Zostałem przekonany, że używają techniki szacowania, ale nie jestem pewien.ddx(5)
jest trochę bezcelowe. Użyj go z wartością wejściową, a to da ci pochodną tej wartości w odniesieniu do sąsiednich pikseli w bloku. Znów nie wiem, jak dokładnie oblicza wartości, ale prośba o pochodną nie-danych wejściowych może być po prostu niezdefiniowanym zachowaniem i produkować śmieci. Zobacz fgiesen.wordpress.com/2011/07/10/..., aby uzyskać więcej informacji, niż mogę dostarczyć.Odpowiedzi:
Wewnętrznie procesory graficzne nigdy nie uruchamiają jednej instancji modułu cieniującego piksele na raz. Na najwyższym poziomie szczegółowości zawsze działają w tym samym czasie 32-64 piksele przy użyciu architektury SIMD. W ramach tego piksele są dalej zorganizowane w kwadraty 2x2, więc każda grupa 4 kolejnych pikseli w wektorze SIMD odpowiada blokowi pikseli 2x2 na ekranie.
Pochodne oblicza się, biorąc różnice między pikselami w kwadracie. Na przykład
ddx
odejmie wartości w pikselach po lewej stronie kwadratu od wartości po prawej stronie iddy
odejmie dolne piksele od górnych. Różnice można następnie zwrócić jako pochodną dla wszystkich czterech pikseli w kwadracie.Ponieważ moduł cieniujący pikseli działa w SIMD, gwarantuje się, że odpowiednia wartość znajduje się w tym samym rejestrze w tym samym czasie dla wszystkich pikseli w kwadracie. Niezależnie od tego, jakie wyrażenie lub wartość wprowadzisz
ddx
lubddy
, zostanie ono ocenione we wszystkich czterech pikselach kwadratu, a następnie wartości z różnych pikseli odjęte, jak opisano powyżej.Zatem przyjęcie pochodnej stałej wartości da zero (jak można się spodziewać po rachunku różniczkowym, prawda?), Ponieważ jest to ta sama stała wartość we wszystkich czterech pikselach.
Należy również zauważyć, że istnieją „zgrubne” i „drobne” pochodne,
ddx_coarse
/ddy_coarse
iddx_fine
/ddy_fine
. Wyjaśnienie tego rozróżnienia znajduje się tutaj . Po prostu zwykłeddx
/ddy
są aliasami dla gruboziarnistych wersji.BTW, powodem tej funkcjonalności jest to, że procesory graficzne muszą wewnętrznie pobierać pochodne współrzędnych tekstury w celu dokonania wyboru mipmapy i filtrowania anizotropowego. Ponieważ sprzęt i tak potrzebuje tej możliwości (możesz użyć dowolnego wyrażenia dla współrzędnych tekstury w module cieniującym), łatwo było też udostępnić go bezpośrednio programistom modułu cieniującego.
źródło
ddx
działa jak każda inna funkcja w tradycyjnym języku programowania; oceniasz dane wejściowe, zmieniasz je na zmiennoprzecinkowe lub cokolwiek, a następnie wykonujesz dla niego funkcję zewnętrzną (ddx
). Ale jest inaczej - pobiera ciąg wejściowy , ocenia go w kilku miejscach, oblicza pochodną i zgłasza wynik. Czy to w porządku?ddx
działa na podstawie wyrażenia, które do niego przekazujesz, a nie na wartości .