Як створити "ретро" піксельний шейдер для трансформованих 2D спрайтів, який підтримує вірність пікселів?


10

На зображенні нижче показано два спрайти, відображені з точковим відбором зверху:

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

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

Як я міг розробити піксельний шейдер, який би відображав трансформований спрайт праворуч з пікселями, вирівняними по осі, такого ж розміру, як і решта сцени?

Це може бути пов’язано з тим, як масштабування спрайту реалізовувалось у старих іграх, таких як Monkey Island, адже саме цього я намагаюся досягти, але з додаванням обертання.


Редагувати

Відповідно до пропозицій якDoD, я намагався вирішити проблему як пост-процес. Найпростіший підхід полягав у тому, щоб спочатку відобразити до окремої цілі візуалізації (зменшити вибірку відповідно до потрібного розміру пікселів), а потім підняти її масштаб під час повторного візуалізації. Він вирішив мої вимоги вище.

Спочатку я спробував це зробити, Linear -> Pointі результат був такий:

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

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

Вдруге я спробував, Point -> Pointі результат був такий:

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

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

Щоб продемонструвати, ось відео ефекту, хоча YouTube відфільтрував пікселі з нього:

http://youtu.be/hqokk58KFmI

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


Це повинен був бути череп ...?
DeadMG

@DeadMG Воловий череп, я думаю?
Девід Гувейя

Приємний ефект, виглядає краще, ніж я думав, що це виглядатиме (я спробував це на ЕКСТРЕМІЛЬНО низькій роздільній здатності та палітрі, 40x30 EGA.) Це в значній мірі вигляд, який ви отримаєте, створюючи свій власний штрих postfx. До речі, я сумніваюся, що є краще рішення проб, яке зберігає ефект, як ви плануєте. NN - це майже те, що надає цей чіткий вигляд, будь-який інший вибірки
розмиє

@kaoD Але пам’ятайте, що я застосовую два проходи. Другий прохід, який переробляє зображення, як і раніше буде найближчим сусідом, щоб зберегти ретро відчуття. Але я думаю, що може бути певна користь у спробі різних методів відбору проб для першого проходження. Я зараз переглядаю Scale2x!
Девід Гувейя

@kaoD Не, я здаюся. Зміна параметрів шейдера між кожним спрайтом викликом SpriteBatchвимагає використання негайного режиму, тому проблем не варто. Я піду з цим :)
David Gouveia

Відповіді:


3

Ви повинні застосувати свій шейдер ПІСЛЯ вашого обертання спрайта.

Якщо вся сцена ще не затінена і ваші спрайти насправді пікселізовані, вам потрібен якийсь фільтр після FX для всієї сцени. Усереднення регіонів пікселів буде добре. Це не зовсім те, що ви маєте намір (це буде виглядати якось порізніше при русі / обертанні), але це може зробити трюк.

Єдиний спосіб зберегти це ретро-правдивість до того, що ви хочете, - це власне зробити власні ротації спрайтів самостійно. Це не має нічого спільного з тим, як було реалізовано масштабування: роздільна здатність насправді була поганою, якщо говорити про те, ви намагалися з надзвичайно низькою роздільною здатністю? Це також може зробити трюк і буде виглядати більш природно, оскільки, власне, саме це спричинило ефект, який ви доглядаєте. І це дешево! Дуже дешевий! Насправді це буде дешевше, ніж у вас вже є (менше фрагментів виконання шейдерів.)

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


Так, я поки не використовую жодних шейдерів. Це просто звичайні спрайти з текстурами з дуже низькою роздільною здатністю, виведені за замовчуванням XNA SpriteBatchіз включеною вибіркою точок. Але пост-фкс справді може вийти. Для початку я спробую візуалізацію з лінійною вибіркою до цілі візуалізації, а потім відправлю всю ціль візуалізації до резервного буфера з точковою вибіркою.
Девід Гувейя

@DavidGouveia не пропустіть можливість занизити вашу роздільну здатність. Якщо ви дійсно хочете досягти оригінального ефекту, це ваш найкращий знімок. Якщо вам потрібна ваша висока роздільна здатність (якщо частина вашого GFX має високу роздільну здатність або ви хочете відповідати нативній роздільній здатності), ви все одно можете перевести в неекранний буфер із низькою роздільною здатністю, а потім пофарбувати його у кадрний буфер високої роздільної здатності як повноцінний -екранний квадратик із відключеною фільтрацією. Майте на увазі, що вам потрібно зіставити пропорції, щоб, звичайно, уникати прямокутних пікселів.
якD

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