Що таке пропускна здатність і як вона працює?


18

Документація OpenGL визначає таку пропускну здатність returns the sum of the absolute value of derivatives in x and y.

Що це означає менш математично, і чи є спосіб її візуалізації?

На основі мого розуміння функції fwidth(p)має доступ до значення pсусідніх пікселів. Як це працює на графічному процесорі, не різко впливаючи на продуктивність, і чи надійно та рівномірно він працює на всіх пікселях?

Відповіді:


18

Піксельні похідні екрану простору роблять істотно впливають на продуктивність, але вони впливають на продуктивність , чи використовуєте ви їх чи ні, так що з певної точки зору вони вільні!

Кожен графічний процесор у недавній історії пакує чотири з чотирьох пікселів і розміщує їх у одній і тій самій основі / хвилі, що по суті означає, що вони працюють прямо поруч із графічним процесором, тому доступ до значень у них дуже дешевий. Оскільки основи / хвильові фронти виконуються в режимі стоп-сигналу, інші пікселі також будуть знаходитись на тому самому місці в шейдері, що і ви, тому значення pцих пікселів буде просто сидіти в регістрі, який чекає на вас. Ці три пікселі завжди будуть виконані, навіть якщо їх результати будуть викинуті. Тож трикутник, який охоплює один піксель, завжди затінює чотири пікселі та викидає результати трьох з них, лише так, щоб ці похідні функції працювали!

Це вважається прийнятною вартістю (для поточного обладнання), оскільки це не лише такі функції, як fwidthці похідні: кожен зразок текстури робить так само добре, щоб вибрати, яку міп-карту вашої текстури читати. Поміркуйте: якщо ви знаходитесь дуже близько до поверхні, координата ультрафіолетового випромінювання, яку ви використовуєте для вибірки текстури, матиме дуже невелику похідну в просторі екрану, тобто вам потрібно використовувати більшу міп-карту, а якщо ви далі, координата УФ буде мати більша похідна в просторі екрану, тобто вам потрібно використовувати меншу карту.

Що стосується того, що це означає менш математично: fwidthце еквівалентно abs(dFdx(p)) + abs(dFdy(p)). dFdx(p)просто різниця між значенням pпікселя x + 1 і значенням pу pixel x і аналогічно для dFdy(p).


Отже, якщо dFdx(p) = p(x1) - p(x), тоді x1може бути або, (x+1)або (x-1), залежно від положення пікселя xна квадратику. У будь-якому випадку, x1він повинен знаходитися в тій самій основі / хвилі, що і x. Я прав?
ApoorvaJ

3
@ApoorvaJ По суті, однакове значення для dFdxобчислюється для кожного з двох сусідніх пікселів у сітці 2x2. І це значення просто обчислюється, використовуючи різницю між двома сусідніми значеннями, якщо це є p(x+1)-p(x)або p(x)-p(x-1)просто залежить від вашого уявлення про те, що xсаме тут. Однак результат однаковий. Так що так, ви маєте рацію.
Кріс каже, що відбудеться Моніка

@ChristianRau Це відповідає на моє запитання. Спасибі.
ApoorvaJ

11

Цілком технічний термін fwidth(p)визначається як

fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))

І dFdx(p)/ dFdy(p)є частковими похідними значень pщодо розмірів екрана xта y. Так вони позначають, як pведе себе значення, коли йде один піксель вправо ( x) або один піксель вгору ( y).

Тепер, як їх можна практично обчислити? Що ж, якщо ви знаєте значення сусідніх пікселів для p, ви можете просто обчислити ці похідні як прямі кінцеві відмінності, як наближення до їхніх фактичних математичних похідних (які можуть не мати точного аналітичного рішення):

dFdx(p) := p(x+1) - p(x)

Але, звичайно, тепер ви можете запитати, як ми навіть знаємо значення значень p(які могли б вплинути на будь-яке довільно обчислене значення всередині програми шейдерів) для сусідніх пікселів? Як ми можемо обчислити ці значення, не зазнаючи великих накладних витрат, зробивши цілі шейдерні обчислення два (або три) рази?

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

Сучасні растризатори називають фрагменти шейдерів у більших плитках з більш ніж одного сусіднього пікселя. У найменших це була б сітка 2х2 пікселів. І для кожного такого піксельного блоку шейдер фрагмента викликається для кожного пікселя, і ці виклики виконуються в ідеально паралельному кроці блокування, так що всі обчислення виконуються в точно такому ж порядку і в точно той же час для кожного з цих пікселів у блоці (саме тому розгалуження в шейдері фрагмента, хоча і не смертельне, слід уникати, якщо це можливо, оскільки кожен виклик блоку повинен був би досліджувати кожну гілку, яка приймається принаймні однією з викликів, навіть якщо вона просто викидає результати після цього, як також зазначено у відповідях на це пов'язане питання). Тож у будь-який момент теоретично фрагмент шейдера теоретично має доступ до значень фрагментів шейдерів сусідніх пікселів. І поки ви не маєте прямий доступ до цих значень, ви маєте доступ до значень обчислених з них, як і похідних функцій dFdx, dFdy, fwidth, ...

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