Що насправді робить ddx (hlsl)?


17

Я трохи розгублений. В офіційній документації ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx ) йдеться про те, що ddx (input) є частковою похідною від введення стосовно до "координати екрана-пробіл."

Моє обчислення чудово, але як я можу сказати, з чого надходить інформація? Якби я передав їй функцію, добре, я можу уявити, що б це робило, але похідна числа завжди дорівнює нулю ...?

Це просто масштабування? Мовляв, це би зменшилося на одну десяту свого розміру на цій відстані, тому воно повертає одну десяту? Але тоді він не потребує введення ...

Чи може хтось швидко пояснити, що насправді відбувається?


2
ddxі ddyробіть магію, яку ви не можете зробити самі. Вони мають доступ до додаткової інформації з конвеєра растерізації, який ви не можете отримати з піксельного шейдера. Я не впевнений, яку саме формулу вони використовують; Мене спонукали вважати, що вони використовують техніку оцінки, але я не знаю точно.
Sean Middleditch

Це глибоко дивно, але все ж. Що насправді представляє ddx (5)? Якщо в ній написано .1, як мені це інтерпретувати? Або -6?
Річард Раст

1
ddx(5)є безглуздим. Використовуйте його із вхідним значенням, і це дасть вам похідну цього значення щодо сусідніх пікселів у блоці. Знову ж таки, я не знаю, наскільки точно він обчислює значення, але запит на похідну від невхідних даних може бути просто невизначеним поведінкою та виробленням сміття. Дивіться fgiesen.wordpress.com/2011/07/10/… для отримання додаткової інформації, ніж я можу надати.
Шон Міддлічч

Я не впевнений, але цілком може бути, що компілятор HLSL насправді робить повну символічну диференціацію виразу, який ви передаєте ddx / ddy. blogs.msdn.com/b/chuckw/archive/2011/03/08/… research.microsoft.com/pubs/146019/…
Ziriax

Що це робить? Тільки трохи розумне , що, очевидно.
MickLH

Відповіді:


32

Внутрішньо GPU ніколи не запускає один екземпляр піксельної шейдера одночасно. На найтоншому рівні деталізації вони завжди працюють одночасно 32-64 пікселів, використовуючи архітектуру SIMD. У межах цього пікселі додатково впорядковуються в 2x2 квадри, тому кожна група з 4 послідовних пікселів у векторі SIMD відповідає блоку 2x2 пікселів на екрані.

Похідні обчислюються, беручи різниці між пікселями у квадратику. Наприклад, ddxбуде віднімати значення в пікселях з лівого боку квадра від значень з правої сторони, і ddyвіднімає нижні пікселі від верхніх. Потім різниці можуть бути повернені як похідні до всіх чотирьох пікселів на квадратику.

Оскільки піксельний шейдер працює у SIMD, гарантується, що відповідне значення знаходиться в одному регістрі одночасно для всіх пікселів на квадратику. Отже, який би вираз чи значення ви не ввели ddxабоddy , воно буде оцінено у всіх чотирьох пікселях квадра, тоді значення з різних пікселів віднімаються, як описано вище.

Тож отримання похідної постійної величини дасть нуль (як ви очікували від обчислення, правда?), Оскільки це однакове постійне значення у всіх чотирьох пікселях.

Також зауважте, що існують "грубі" та "тонкі" похідні, ddx_coarse/ ddy_coarseта ddx_fine/ ddy_fine. Пояснення розрізнення наведено тут . Просто просто ddx/ ddyє псевдонімами для грубої версії.

BTW, причина цієї функціональності існує в тому, що GPU мають внутрішньо брати похідні текстурних координат, щоб здійснити вибір mipmap-карти та анізотропну фільтрацію. Оскільки апаратне забезпечення в будь-якому випадку потребує можливостей (ви можете використовувати будь-яке довільне вираження для координат текстури в шейдері), було досить просто також піддавати його безпосередньо програмістам шейдерів.


+1; Я вважаю це корисним при застосуванні ефекту збурення до текстури; збурені текстові слова давали деяке спотворення кольорів, але використання tex2Dgrad з похідними від оригінальних (невпорядкованих) текстових рядків дало неспотворений результат.
Максим Мінімус

Добре, після деякої думки я думаю, що я з'ясував свою плутанину. На мій погляд, ddxпрацює як і будь-яка інша функція в традиційній мові програмування; Ви оцінюєте вхід, перетворюєте його на поплавок або що завгодно, а потім виконуєте зовнішню функцію ( ddx). Але це інакше - він бере рядок введення , оцінює його в декількох місцях, обчислює похідну та повідомляє про результат. Це правильно?
Річард Раст

1
@RichardRast Правильно. Ви можете подумати ddxяк про дію на вираз, який ви передаєте йому, а не значення .
Натан Рід

Але бачте, це досить дивно, що це має бути в документації. Я не можу думати про інший час у своєму програмуванні, де це було так.
Річард Раст

Натан Рід зазначив, що GPU використовують ці функції для вибору mipmap. Ви також можете використовувати їх, щоб змусити GPU вибрати потрібний рівень mipmap або не допустити артефактів від неправильного вибору рівня mip. Процес описаний на сторінках 163 та 164 Shader X3.
JamesHoux
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.