Що таке похідні на екрані, і коли я їх використовуватиму?


12

Я бачу функції ddxі ddyglsl і еквіваленти hlsl раз у раз з'являються у шейдерному коді. В даний час я використовую їх для того, щоб робити картографічне зіставлення без дотичної чи бітангендної форми, але я в основному копіюю вставлений код. Я не розумію, що ці функції є насправді, що вони роблять, і коли я б хотів їх використовувати.

Отже, питання:

  1. Що таке похідні функції екранного простору?
  2. Що роблять ці функції? Вхідні та вихідні значення
  3. Які ефекти вони найчастіше використовують?
  4. Які ефекти вимагають, щоб ви дивилися на ці функції?

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

@ LeComteduMerde-fou що таке текстурні основи? Швидкий google підказує, що ви маєте на увазі обгортання?
NeomerArcana

Ні, я маю на увазі основи , тобто спотворюючи текстуру, змінюючи координати текстури з часом.
Максим Мінімус

Дивіться це пов'язане питання . Я не думаю, що це зовсім дублікат, оскільки пов'язане питання задає більше питання про те, як ці функції працюють / як вони обчислюються, а не вищого рівня "що це таке і для чого це добре?"
DMGregory

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

Відповіді:


12

По-перше, це допомагає знати, що графічні процесори завжди оцінюють фрагменти / піксельні шейдери на 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 самостійно може замовчувати грубі похідні)


Якщо ви говорите, що це різниця між пікселями від однієї сторони блоку 2x2 до іншої, чи це різниця у значенні пікселів чи різниця в положенні текселя? Якщо це різниця у вартості, чи підсумовує текстиль між ними чи щось таке?
NeomerArcana

Це різниця у значенні аргументу ( vтут), і оскільки це квадрати 2х2, пікселів між ними немає. Отже, якщо ми затінюємо верхній лівий фрагмент квадра, і v = 1 там, а в правому верхньому фрагменті v = 4, то ddx (v) = 3 (кажучи, що «v збільшується на 3 під час руху зліва направо »)
DMGregory

Я все ще не зовсім розумію. Якщо я переглядаю під кутом, блок 2x2 може не складатися з пікселів поруч із текстурою. Отже, різниця у значеннях - це різниця між двома вибраними текстолями, або різниця між двома вибраними текселями, беручи до уваги пропущені?
NeomerArcana

Забудьте про текселі - це не вибірки текстури. Він приймає буквальне значення аргументу, який ви передали ddx або ddy, і порівнює це зі значенням, переданим ddx або ddy, при оцінці сусіднього фрагмента. Якщо це значення походить від зразка текстури, так і бути, але похідні функції не мають ніяких знань про текстури. Вони просто віднімають числа. Спробую додати схему до цієї відповіді, як тільки я повернусь до свого ПК.
DMGregory

О, я думаю, я зараз розумію. Було б чудово отримати діаграму, але я думаю, що я розумію. Вони здаються дуже корисними функціями.
NeomerArcana
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.