Подтвердить что ты не робот

Объяснение dFdx

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

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

  • Производная - это скорость изменения
  • Частная производная функции с двумя параметрами заключается в том, что вы дифференцируете функцию, сохраняя один из постоянных параметров.
  • 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 соответственно?

4b9b3361

Ответ 1

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

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

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

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

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