Покриття - недолік в алгоритмі - як позбутися від його використання?


10

Вступ

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

Це призводить до проблеми конфлікту, оскільки вона охоплює охоплення прозорістю. Альфа-змішування дотримується правила, яке не відображає ситуацію точно, наприклад, взяти піксель із покриттям на 50%, сусідній з пікселем, який також на 50% доповнений, не закінчується зі 100% покриттям, і закінчується 75% покриттям . Як це виглядає, залежить від налаштування алгоритму та інших деталей, але по суті це відома помилка. Хтось навіть пережив проблему документування різних помилок двигуна разом із написанням паперу, де було показано, як це можна зробити краще.

введіть тут опис зображення

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

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

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

Питання

Як поширюється помилка? Оскільки вони роблять однакову помилку, можна зробити висновок, що вони використовують одне і те ж джерело для свого алгоритму. Що могло змусити дизайнерів обрати цей алгоритм? Чому лише 3D-програмісти визнали цю помилку і навіть зашифрували її частину у своїх API та викладанні, тоді як 2D програмісти не зробили?

Як переконатися, що ця помилка перестає поширюватися далі?


Додаток (але я про це не запитую)

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

Щоб він працював послідовно, як описано в одній з відповідей. Нам потрібно зробити обробку зразків цілим числом відбору для узгодженості. Це запевняє нас, що кожна точка, перетворена на простір екрану, отримує абсолютно однакове рішення для рівних координат і що жоден зразок не затінений піксельною межею в 2 рази. Для цього зразок може не запускати піксель, якщо він точно включений, якщо це, наприклад, зразок лівого нижнього боку (тому ми робимо правило, щоб точні краї оброблялися в> vs <=). Усі графічні карти, крім однієї консолі, працюють так. Це гарантує, що зайвих даних не потрібно кешувати і не потрібно робити додаткових тестувань поблизу. Це рішення є настільки ж стабільним, більш загальним та послідовним, ніж рішення, що базуються на покритті.

Алгоритм точно такий же, як оригінал, з трохи меншим кодом і трохи більше зразків. Таким чином, це так само послідовно, якщо не більше, ніж алгоритм на основі покриття. Ми це знаємо, тому що такі методи ми використовували протягом багатьох років майже в будь-якому іншому полі обробки сигналів, а також відеокартах.

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


Після додавання робочого дня додаю фотографії до своєї амнедуму. Зрештою це обробка графіки, вона має візуальну інтерпретацію
joojaa

Відповіді:


6

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

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


Насправді вам не потрібно зберігати зразки, все, що вам потрібно зробити - це зберігати налаштування для растеризації. Метод на основі покриття також не зберігає їх, тому це не є кроком назад. Наївний метод представлений лише тому, що його легко зрозуміти, ви можете легко зробити вибіркове на основі пріоритету. Крім того, якщо ви хочете перенести рішення, що базуються на покритті, до GPU, вам потрібно буде зробити багато зайвих робіт, і ви будете несумісні з його моделлю.
joojaa

@joojaa: чи можете ви окреслити те, що ви маєте на увазі під „зберіганням налаштувань на растеризацію”, або надати посилання, де підхід пояснюється так, що вам не доведеться копатись через науковий документ на 20 сторінках?
Doc Brown

Кожен піксель не залежить один від одного, тому зберігати зразки потрібно лише під час роботи пікселя, після цього ви можете сміливо їх відкидати. Якщо ви хочете скористатися фітнесом вищого порядку, тоді ви можете зберігати лише обмежене уявлення. Тому все, що вам потрібно зробити, це виділити пам'ять для вашої обробки ядра, так, можливо, (16-256 байт за нитку)
joojaa

о, вибачте, що вам навіть не потрібно зберігати зразки, якщо ви робите поле фільтрації, ви можете просто використовувати формулу для ковзання / бігу середньої, яка вам не потрібна для зберігання окремих зразків
joojaa

@joojaa: Я не розумію - чи не потрібно обчислювати зразки насамперед пов’язаних форм , можливо, сотні чи тисячі, а потім відфільтрувати до растрового відображення?
Doc Brown

6

Надсистематизація взагалі не вирішить проблему: вона просто зробить її менш помітною. Якщо пікселі наполовину менше, проблема буде наполовину помітнішою, але вона не зникне.

Архітектурна точка, що стоїть за цими конструкціями, полягає в тому, що ми хочемо, щоб команда "візуалізувати трикутник ABC" мала певне значення. Ми не хочемо, щоб це було неоднозначним, за винятком випадків, коли вони розглядаються як частина колекції команд малювання - наприклад, мають одне значення, коли "візуалізувати трикутник BCD" також є у колекції (з тим самим чи іншим кольором) та інше значення, коли це не так.

Якщо врахувати, наприклад, тисячу трикутників, навіть знайти всі трикутники, які ділять сторону або частину сторони з ABC, обчислювально важко (пам'ятаючи, що це потрібно повторно зробити тисячу разів). Також є багато інших практичних проблем: особливо, що всі оригінальні запити на надання повинні зберігатись, навіть якщо вони були зроблені давно, якщо їх потрібно переосмислити через новий, додатковий запит.

Суть полягає в тому, що ідеально послідовне рішення неможливо здійснити. Залишається питання: чи варто намагатися покращити ситуацію, що склалася, коли зможемо? Загалом, відповідь на це питання - Ні . Ідеально послідовна реалізація моделі завжди краща, навіть якщо сама модель має обмеження, які ви проілюстрували. Альтернативою може бути реалізація, яка іноді стає кращою, а іноді - ні, так як програміст не може знати, що з цих двох буде в будь-якому конкретному випадку. Більше того, він може перейти від "робить краще" до "не робить кращого" внаслідок крихітних змін, внесених програмістом, або навіть внаслідок тих, що не знаходяться під контролем програміста. У контексті програмування передбачуваність далеко,


Це проблема розрахунку покриття, якщо мій суперсемплінг НЕ виконує обчислення покриття, то у нього немає проблем, оскільки він сходиться до реальної відповіді, а не просто зменшує проблему. Вам потрібен якийсь код, щоб довести це? Ось так працює ваша відеокарта, і ця проблема не виникає. Інакше кожна гра, яку ви бачите, виявила б проблему. Я не купую цю відповідь, оскільки вона заснована на помилковій логіці.
joojaa

Ігри @joojaa або не роблять анти-згладжування, або використовують супер-вибірку для згладжування, що дає, як правило, чотири рівні антизбудження. Це недостатньо добре для графіки якості презентації, де вам потрібно близько 64 рівнів на антизбудження. Тож ігри змінюють одну проблему на іншу.
Піт Кіркем

@PeteKirkham залежить від вашого налаштування, деякі гами дозволяють задавати вибіркові суми. У будь-якому випадку вам не потрібно більше 16 зразків для створення AA рівня презентації, якщо ви використовуєте фільтр вищого порядку, ніж фільтрування в коробці. Зауважте, що в моєму прикладі зображення про помилки в моєму прикладі НЕ робиться надсимплементацією всередині апаратного переутворювача.
joojaa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.