Як обчислюються рівні mipmap у металі?


14

Моє запитання стосується саме металу, оскільки я не знаю, чи зміниться відповідь для іншого API.

Я вважаю, що зараз я розумію, це:

  • Структурована текстура заздалегідь розраховувала "рівні деталізації", де нижчий рівень деталізації створюється шляхом деформації оригінальної текстури деяким змістовним чином.

  • Рівні Mipmap посилаються на низхідний рівень деталізації, де рівень 0є початковою текстурою, а вищі рівні - це зменшення потужності двох.

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

Те, що я не зовсім розумію, - це те, як обираються ці рівні mipmap. У документації до стандартної бібліотеки Metal я бачу, що можна взяти зразки, із зазначенням примірника lod_optionsтипу або без нього . Я б припустив, що цей аргумент змінює спосіб вибору рівнів mipmap і, мабуть, існує три види lod_optionsдля двовимірних текстур:

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

На жаль, документація не заважає пояснювати, що робить будь-який із цих варіантів. Я можу здогадатися, що bias()змінює деякий автоматично обраний рівень деталізації, але що тоді означає зміщення value? Який масштаб працює? Точно так же, як це lodв level()перекладі на дискретні рівні MIPMAP? І, працюючи в припущенні, що gradient2d()використовує градієнт координати текстури, як він використовує цей градієнт для вибору рівня mipmap?

Що ще важливіше, якщо я lod_optionsпропущу, як вибираються рівні mipmap? Чи відрізняється це залежно від типу функції, яка виконується?

І якщо sample()функція, визначена за замовчуванням, яка не задається параметрами функції, полягає в тому, щоб зробити щось на кшталт gradient2D()(принаймні, в шейдері фрагмента), чи використовує він прості похідні екранного простору чи це працює безпосередньо з растризатором і інтерпольованими координатами текстури. обчислити точний градієнт?

І нарешті, наскільки послідовною є така поведінка від пристрою до пристрою? Стара стаття (стара, як у DirectX 9), яку я читав, згадується про складний вибір пристрою mipmap, специфічний для пристрою, але не знаю, чи краще вибір mipmap визначається в нових архітектурах.

Відповіді:


17

Селекція Mip досить добре стандартизована на всіх пристроях сьогодні, за винятком деяких тонкозернистих деталей анізотропної фільтрації, які все ще визначаються окремими виробниками GPU (а її точні деталі, як правило, не публікуються у публічному доступі).

Хороше місце, щоб детально ознайомитись з вибором мип - у специфікації OpenGL, розділ 8.14, "Зменшення текстури" . Я б припустив, що він працює так само, як і в Metal. (Apple могла б щось змінити, враховуючи, що вони виготовляють як апаратне забезпечення, так і API ... але я сумніваюся, що вони є.) Я підсумую це тут.

Вибір міп за замовчуванням (не використовуючи жодного з lod_optionsмодифікаторів) використовує градієнти простору екрану з текстурними координатами для вибору рівнів мип. По суті, він намагається підібрати рівні мип, які дають максимально наближене до 1: 1 зіставлення текстолів до пікселів. Наприклад, якщо градієнти мають довжину 4 текселі на піксель, він вибрав би рівень 2 міп (що на 1/4 розміру рівня 0 і, отже, дає вам 1 міп текселя на піксель).

Завдяки трилінійній фільтрації, оскільки ви зазвичай не орієнтуєтеся на точне відображення 1: 1, воно вибирає два найближчі рівні та лінійно інтерполює між ними, щоб у вас був плавний перехід між рівнями мип, коли камера або об’єкти у вашій сцені рухаються навколо.

λλλλ=2.8

λжурнал2(1/4)=-2

Тепер, що стосується параметрів модифікатора:

  • biasλ
  • levelλλlod
  • gradient2dдозволяє вставити власні вектори градієнта, які замінюють неявні градієнти екранного простору координат текстури. Решта процесу відбору та відбору проб протікає як звичайно, але зі зміненими градієнтами. Це дозволяє налаштувати анізотропну фільтрацію.

В інших типах шейдерів, крім фрагментів шейдерів, немає поняття "градієнти простору екрану", тому останні дві операції, як правило, є єдиними дозволеними - будь-яка операція, яка намагається використовувати неявні градієнти, призведе до помилки компіляції. Я не впевнений, що так це робить Metal, але саме цього я б очікував від роботи з іншими API.

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