По-перше, це допомагає знати, що графічні процесори завжди оцінюють фрагменти / піксельні шейдери на 2x2 блоки пікселів одночасно. (Навіть якщо в кінцевому підсумку потрібно намалювати лише деякі з цих пікселів, а інші - поза полігоном або оклюдировані - непотрібні фрагменти маскуються, замість того, щоб їх писали наприкінці).
Похідна екранного простору змінної (або виразу) v
у вашому шейдері - це різниця у значенні v
(у цій точці коду) від однієї сторони цього квадрата 2x2 пікселів до іншого. тобто. ddx
- значення v
правого пікселя мінус значення v
лівого і аналогічно для ddy
вертикального.
Це відповідає "наскільки швидко v
збільшується чи зменшується, коли ми рухаємося горизонтально (ddx) або вертикально (ddy) по екрану?" - тобто. з точки зору обчислення, він наближає часткові похідні вашої змінної (приблизні, оскільки він використовує дискретні вибірки на кожному фрагменті, а не математично оцінює нескінченно малу поведінку функції)
Для скалярних величин ми можемо також розглядати це як вектор градієнта, ∇v = float2(ddx(v), ddy(v))
який вказує вздовж напрямку екранного простору, в якому v
найбільш швидко зростає.
Цей тип інформації часто використовується внутрішньо для вибору відповідної карти або анізотропного фільтруючого ядра для пошуку текстур. Наприклад, якщо моя камера виглядає майже паралельно вертикальному uv
напрямку фактурної площини підлоги, ddy(uv.y)
вона буде дуже великою порівняно з ddx(uv.x)
(оскільки вертикальна вісь накреслена на екрані - один піксельний крок вертикально покриває довший простір текстурного простору), який повідомляє обладнання для відбору текстур, що мені потрібно анізотропна фільтрація, щоб розмити вертикальний напрямок текстури більше, ніж горизонтальний, щоб уникнути збиття артефактів.
Для більшості простих ефектів вам не потрібно використовувати ці похідні, оскільки основні методи двовимірного відбору текстури обробляють це за вас. Але як згадує Le Comte du Merde-fou у коментарі вище, коли ви спотворюєте пошук текстури, можливо, вам доведеться вручну витягнути та / або помасажувати похідні екрану для використання, щоб допомогти апаратному вибору відповідної фільтрації (наприклад, через tex2Dlod
в HLSL)
Наклейки екранного простору - один із таких випадків, коли один блок 2x2 може охоплювати велику розрив стрибка в обчисленій координаті текстури, що призводить до розмитого або псевдонімічного краю, якщо ви дозволите системі наївно розрахувати рівень фільтрації. Ця стаття детально розглядає цей артефакт та підходить до його пом'якшення .
Ці похідні також можуть бути зручними, коли ви використовуєте функції шуму для створення процедурної текстури. Якщо, скажімо, ви хотіли перетворити процедурний шум у звичайну карту, ddx & ddy дають простий, якщо приблизний спосіб обчислити, як змінюється значення шуму в районі поточного фрагмента, і в який спосіб він похилий, тож ви може побудувати відповідний нормальний.
Методи візуалізації антиаліазних ліній або виділень перехрестя можуть також використовувати похідні екранного простору, щоб забезпечити послідовність товщини / випадання та не залежати від геометрії чи кута огляду.
У цій розмові про переведення піску в "Подорожі " доповідач згадує, що вони могли використовувати ці похідні функції, щоб контролювати, як блискучий пісок уздовж оглядових країв ... якби вони про них знали в той час (замість цього вони використовували хитромудрий фокус, який під кришкою все одно живиться від таких видів похідних)
Остання остання нота, про яку слід пам’ятати: похідні екранного простору можна обчислити з «грубою» / низькою точністю (мається на увазі, що одна пара похідних ділиться на всю квадру) або «точна» / висока точність (тобто кожен піксель порівнюється лише з його безпосередньою сусіди по квадрату, які могли б дати чотири різних похідних пари над квадом). Грубого, як правило, багато, але якщо ви помітили, що в результаті ви бачите 2x2 блоки, це гарна підказка, яку ви хочете переключити на точну / високу точність. ;)
(У діаграмі вгорі я використовував розрахунки для тонких похідних, але будьте обережні, що просто DDx / ddy самостійно може замовчувати грубі похідні)