Объяснение dFdx

Я пытаюсь понять функции dFdx и dFdy в GLSL.

Я понимаю следующее:

  1. производная-это скорость изменения
  2. частичная производная функции с двумя параметрами - это когда вы дифференцируете функцию, сохраняя один из параметров постоянным.
  3. dFdx и dFdy находят скорость изменения значения между текущим фрагментом и соседним фрагментом.

Я не поймите, о чем говорит скорость изменений. Это скорость изменения координат фрагментов?

возможно ли, что вы можете найти скорость изменения произвольной переменной между двумя вызовами шейдера фрагментов? Являются ли вызовы шейдеров" чтением " переменных из соседних вызовов? Для (упрощенного) примера:

// 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);

будет ли d -1.0 и 1.0 соответственно?

1 ответов


чтобы понять, как эти инструкции работают, это помогает понять основную архитектуру выполнения графических процессоров и как фрагментарные программы сопоставляются с этой архитектурой.

графические процессоры запускают кучу потоков в "lock-step" по той же программе, каждый поток которой имеет свой собственный набор регистров. Таким образом, он извлекает инструкцию, а затем выполняет эту инструкцию N раз, один раз для каждого запущенного потока. Чтобы иметь дело с условными ветвями и такими, у них также есть "активная маска" для текущего запуск группы потоков. Потоки, которые не активны в маске, фактически не запускаются (поэтому их регистры не меняются). При наличии условной ветви или соединения (целевой ветви) маска потока изменяется соответствующим образом.

теперь, когда выполняется программа фрагментов, фрагменты, которые нужно запустить, расположены в" квадратики " -- квадраты 2x2 из 4 пикселей, которые всегда работают вместе в группе потоков. Каждый поток в группе знает свою собственную координату пикселя и может легко найти координату соседний пиксель в квадрате, перевернув самый низкий бит X (или y) coord.

когда GPU выполняет инструкцию DDX или DDY, происходит то, что он заглядывает в регистры для потока для соседнего пикселя и вычитает значение из текущего пикселя-вычитает значение для более высокой координаты (самый низкий бит 1) из Нижнего (самый низкий бит 0).

это имеет значение, если вы используете dFdx или dFdy в условной ветви -- если один из потоки в quad активны, в то время как другой нет, GPU все равно будет смотреть на регистр неактивного потока, который может иметь любое старое значение в нем, поэтому результат может быть любым.