Вступ
Багато двигунів візуалізації основної векторної графіки мають у них алгоритмічний недолік. Вони надають кожну фігуру окремо та антиаліас, обчислюючи покриття пікселів, а потім складають їх один на одного. Так, це просто, але правильні рішення ще простіші.
Це призводить до проблеми конфлікту, оскільки вона охоплює охоплення прозорістю. Альфа-змішування дотримується правила, яке не відображає ситуацію точно, наприклад, взяти піксель із покриттям на 50%, сусідній з пікселем, який також на 50% доповнений, не закінчується зі 100% покриттям, і закінчується 75% покриттям . Як це виглядає, залежить від налаштування алгоритму та інших деталей, але по суті це відома помилка. Хтось навіть пережив проблему документування різних помилок двигуна разом із написанням паперу, де було показано, як це можна зробити краще.
Зображення 1 : Повністю нерепрезентативний зразок відображення форми, складеної з трикутників, що показує збільшену помилку у верхньому рядку. SVG-джерело
Проблема має просте наївне рішення * просто супер зразок без розрахунку покриття і відфільтруйте зображення вниз. В якості бонусу ви можете використовувати кращі алгоритми відновлення зображення, ніж фільтрування коробки (читайте "Піксель - це не квадрат 3" ). Існують навіть рішення, що мають порівнянну швидкість, як поточні рішення, і такі рішення набагато простіше зробити в апаратних растеризаційних трубопроводах (і ви рідко бачите цю помилку на GPU, оскільки вона побудована, щоб уникнути саме цієї проблеми).
Це також не проблема без витрат. Є багато людей, які працюють у графічному дизайні, які витрачають нетривіальну кількість часу, намагаючись обійти цю проблему вручну, переконавшись, що тут є перекриття і немає перекриттів, щоб вирішити проблему, яку комп’ютер повинен зробити для них. І в багатьох випадках ефектно не вдається. Але їх клієнтам байдуже, чому помилка там, вони повинні виправити.
Питання
Як поширюється помилка? Оскільки вони роблять однакову помилку, можна зробити висновок, що вони використовують одне і те ж джерело для свого алгоритму. Що могло змусити дизайнерів обрати цей алгоритм? Чому лише 3D-програмісти визнали цю помилку і навіть зашифрували її частину у своїх API та викладанні, тоді як 2D програмісти не зробили?
Як переконатися, що ця помилка перестає поширюватися далі?
Додаток (але я про це не запитую)
* Мабуть, моє твердження, що супервідбір проб працює без вад, є надзвичайним і вимагає надзвичайних доказів. Гаразд, тому ключовим для роботи супер вибірки є те, що супер вибірки не обробляють покриття. По суті, супервідбірник розглядає кожен зразок як точковий зразок. Оскільки точковий зразок не припускає основної області, він не викликає порівняння альфа там, де цього не відбувається.
Щоб він працював послідовно, як описано в одній з відповідей. Нам потрібно зробити обробку зразків цілим числом відбору для узгодженості. Це запевняє нас, що кожна точка, перетворена на простір екрану, отримує абсолютно однакове рішення для рівних координат і що жоден зразок не затінений піксельною межею в 2 рази. Для цього зразок може не запускати піксель, якщо він точно включений, якщо це, наприклад, зразок лівого нижнього боку (тому ми робимо правило, щоб точні краї оброблялися в> vs <=). Усі графічні карти, крім однієї консолі, працюють так. Це гарантує, що зайвих даних не потрібно кешувати і не потрібно робити додаткових тестувань поблизу. Це рішення є настільки ж стабільним, більш загальним та послідовним, ніж рішення, що базуються на покритті.
Алгоритм точно такий же, як оригінал, з трохи меншим кодом і трохи більше зразків. Таким чином, це так само послідовно, якщо не більше, ніж алгоритм на основі покриття. Ми це знаємо, тому що такі методи ми використовували протягом багатьох років майже в будь-якому іншому полі обробки сигналів, а також відеокартах.
То чи має цей метод і зворотний бік? Добре це повільніше, якщо ви просто зробите наївне припущення. Теоретично він має більш швидку асимптотичну поведінку, ніж растризатор покриття, трохи схожий на промінь-трейсер, він все ще є на рівні в типових сценах. Крім того, це може зробити ефекти на основі згортання більш болючими у здійсненні.
