Wyjaśnienie dFdx

Próbuję zrozumieć funkcje DFDX i dfdy w GLSL.

Rozumiem co następuje:

  1. pochodną jest szybkość zmiany
  2. pochodna cząstkowa funkcji z dwoma parametrami jest wtedy, gdy rozróżniamy funkcję zachowując jeden z parametrów na stałe.
  3. dFdx i dFdy ustalają szybkość zmiany wartości pomiędzy bieżącym fragmentem a sąsiednim fragmentem.

Nie rozumiem, jaka jest szybkość zmian nawiązując do. Czy to szybkość zmiany współrzędnych fragmentów?

Czy możliwe jest, że można znaleźć szybkość zmiany arbitralnej zmiennej pomiędzy dwoma wywołaniami shadera fragmentów? Czy wywołania shaderów "odczytują" zmienne z sąsiednich wywołań? Dla (uproszczonego) przykładu:

// invokation for fragment 1
float x = 1.0;
float d = dFdx(x);

// invokation for fragment next to fragment 1 along the x axis.
float x = 2.0;
float d = dFdx(x);

Czy d będzie odpowiednio -1,0 i 1,0?

Author: bwroga, 2013-05-03

1 answers

Aby zrozumieć, jak działają te instrukcje, pomaga zrozumieć podstawową architekturę wykonywania GPU i jak programy fragmentowe mapują tę architekturę.

GPU uruchamiają kilka wątków w 'lock-step' przez ten sam program, który każdy wątek ma swój własny zestaw rejestrów. Pobiera więc instrukcję, a następnie wykonuje ją N razy, raz dla każdego uruchomionego wątku. Aby poradzić sobie z gałęziami warunkowymi i takimi, mają również "aktywną maskę" dla aktualnie działających Grupa wątków. Wątki, które nie są aktywne w masce, nie są uruchamiane (więc ich rejestry się nie zmieniają). Ilekroć istnieje warunkowa gałąź lub połączenie (gałąź docelowa), Maska wątku jest odpowiednio zmieniana.

Teraz, gdy program fragment jest uruchomiony, fragmenty do uruchomienia są ułożone w "quady" - kwadraty 2x2 po 4 piksele, które zawsze działają razem w grupie wątków. Każdy wątek w grupie zna własną współrzędną pikseli i może łatwo znaleźć współrzędną sąsiednich piksel w kwadracie, przerzucając najniższy bit koordu x (lub y).

Gdy GPU wykonuje instrukcję DDX lub DDY, dzieje się tak, że zagląda do rejestrów wątku dla sąsiedniego piksela i odejmuje wartość od bieżącego piksela-odejmując wartość dla wyższej współrzędnej (najniższy bit 1) od dolnej (najniższy bit 0).

Ma to implikacje, jeśli używasz dFdx LUB dFdy w gałęzi warunkowej - jeśli jeden z wątków w quadzie jest aktywny podczas gdy drugi nie jest, GPU nadal będzie patrzeć na rejestr nieaktywnego wątku, który może mieć dowolną starą wartość w nim, więc wynik może być cokolwiek.

 97
Author: Chris Dodd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-03 23:05:16