Як я можу створити великий космічний фон, який повторюється непомітно


14

Як я можу створити великий космічний фон, який повторюється для гри на rts. Я хочу також мати складні туманності та пилові поля, але оскільки у одиниць буде багато місця для дослідження, я не можу мати 120000px на 1200000px jpeg, тому я хочу, щоб зображення повторювалося, але не було змінити лінії між сегментами.

Я використовую це в рамках Babylon Framework від Microsoft для веб-полотна GL


8
Чи розглядали ви просто використовувати процедурний шейдер замість будь-якого зображення? Простий пошук в Інтернеті підніс це, що виглядає дуже вражаюче: casual-effects.blogspot.com.au/2013/08/starfield-shader.html
LeFauve

@LeFauve Насправді мені дуже подобається ця ідея. Чи пам’ятає гра, яка була створена за минулий час, коли ви повертаєтесь на неї? Як я можу керувати цим у пам’яті браузера?
SuperUberDuper

@SuperUberDuper: Немає необхідності в цьому "запам'ятовувати" що-небудь, доки воно створюється детерміновано та локально. Просто регенеруйте дані, коли це потрібно.
R .. GitHub СТОП ДОПОМОГАЙТЕ

@LeFauve: Це дійсно має бути відповіддю. Це набагато краще, ніж відповіді.
R .. GitHub СТОП ДОПОМОГАЙТЕ

@R .. Я згоден, також було б непогано мати якийсь код для цього в webGL;)
SuperUberDuper

Відповіді:


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

  2. створюйте свої фони процедурно. Замість однієї величезної фонової графіки майте кілька різних менших елементів та розміщуйте їх декілька разів випадковим чином у всьому світі гри.

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


7

Спосіб побудови нескінченного фону для 2D гри полягає в наступному:

  1. Використовуючи програмне забезпечення для графічного редактора (наприклад, iDraw для Mac), створіть зображення A, яке представляє частину фону. Це зображення повинно мати обмежений розмір.
  2. Скопіюйте A і віддзеркалюйте його на осі Y, це B
  3. Тепер вставте (горизонтально) перемикач A і B, це AB .
  4. Нарешті імпортуйте зображення AB у свою гру і повторіть її горизонтально за допомогою коду стільки разів, скільки вам потрібно.

Сподіваюсь, це допомагає.


2
Обмежений розмір, але не надто обмежений. Чим менше плитка, тим очевиднішим буде повтор.
cHao

1
Або замість дзеркального відображення використовуйте фільтр Offset у Photoshop і клонуйте штамп через межі, або просто використовуйте фільтр GIMP «Зробити безшовний» (Фільтр → Карта → Зробити безшовним).
wchargin

5

Шари добре працюють.

Ось кілька математичних питань:

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

Якщо довжина доріжки дорівнює l а колесо має радіус, rто 2pi rце окружність колеса, ration=l/(2pi r)якщо співвідношення скаже 10,25, то колесо буде отримувати в ньому висічки щоквартально, коли їде довгою.

Це найпростіший спосіб, який я можу придумати, щоб пояснити покриття просторів.

Тож припустимо, що у вас є два зображення, якщо у одного є таке співвідношення чверті, ви отримаєте 4-фазний малюнок, воно повториться через 4 плитки. Припустимо, у вас є 1 основний фон і 2 накладки з m і n фазами. Потім шаблон повториться після m * n плиток.

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

Ви можете використовувати цю техніку (особливо з частинками та іншим) для створення безлічі "унікальних" речей з дуже невеликими зусиллями.

Назад до колеса поїзда, якщо коефіцієнт нераціональний, то виїмки прикриють колесо! Але це насправді не має значення.


5

Ось ще одна ідея, яка, здається, відсутня:

У випадку з далекими фонами, як-от небесні коробки, шари Parallax не дуже добре почуваються. Подумайте, наприклад, про зірки, коли ходити по землі, а ще краще через ніч, всі зірки рухаються разом, хоча ми знаємо, що вони сотні чи думки, що проходять через рік один від одного. Вся справа в тому, що вони занадто далеко для нас, щоб помітити їх відстані. Все, що було сказано, ми все ще хочемо дуже велику текстуру (скажімо, 120 к * 120 к), щоб бути намальованою з нашою обмеженою обчислювальною потужністю (яка може справлятись з максимумом 8 к * 8 к). Як і використання декількох шарів паралакса, ви повинні створювати різні текстури, кожен з різними видами деталей. Наприклад, одна представляє галактики, інша - купу зірок тощо. Але цього разу замість того, щоб рухати їх з різною швидкістю, вони повинні відрізнятися за своїми розмірами. Ось приклад. Подумайте про використання 3 текстур, один - 2048 * 2048, інший - 729 * 729, а третій - 625 * 625. Оскільки ці цифри є одночасними між собою, то, комбінуючи ці 3 текстури в 3 шари, слід перемістити lcm (2048,729,625) = 764M пікселів від походження, щоб побачити те саме, що намальовано, яке виглядає як нескінченність. Насправді ви можете додати інші шари або змінити розмір кожної текстури, і ви завжди отримаєте такий великий результатнайменш поширений кратний розмір текстури.


2
Ця відповідь @ @ AlecTeal описує техніку, яку називають Принципом Цикади . Це простий спосіб створити невипадковий, дуже великий не повторюваний фон з дуже невеликими ресурсами.
Лі Лі Раян

4

Це здається завданням для процедурного піксельного шейдера.

Перевагами перед використанням зображення є:

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

Простий пошук в Інтернеті підніме цей шейдер http://casual-effects.blogspot.com.au/2013/08/starfield-shader.html, який схожий на те, що ви шукаєте.

Я не є експертом по WebGL, але згідно з цією сторінкою , схоже, він використовує звичайну мову GLSL (це C-Like мова, яка використовується графічними картками для програмування шейдерів). Це означає, що вам, мабуть, доведеться майже нічого не змінити, щоб він працював.

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

На цій сторінці блогу перераховані всі кроки для впровадження шейдера в WebGL. Це здається гарним місцем для початку.

Ще одне хороше місце для пошуку чудових прикладів шейдерів - https://www.shadertoy.com/


Велике спасибі !!! Зараз мені важко підібрати відповідь!
SuperUberDuper

2
Що ж, якщо у вас є можливість спробувати шейдери, це, безумовно, щось, що буде корисно в довгостроковій перспективі, якщо ви хочете робити гарні ігри. Перший крок трохи високий (мені знадобилося 2 тижні, щоб мій перший шейдер виглядав так, як я цього хотів), але він вартує цього в довгостроковій перспективі.
LeFauve

2

Ви можете вирізати великий jpeg невеликими сегментами і розмістити їх (видима частина), вам навіть не потрібно зберігати його в пам'яті весь час.

І як у старих іграх, деякі «плитки» можуть повторюватися. Це було загальним рішенням для консолі NES, це навіть підтримувалося апаратним забезпеченням.


1
Надзвичайно важко, якщо не неможливо, розрізати JPEG на менші JPEG, які зшиватимуться без візуальних збоїв через втрату стиснення. Якщо ви перейдете на плитки, вам доведеться використовувати формат файлів стиснення без втрат, як PNG.
LeFauve

1
Я погоджуюся, що PNG може бути кращим, з іншого боку, JPEG-текстури є поширеними в 3d-графіці, і важливіше використання JPEG-блоків 16x16 для кодування en.wikipedia.org/wiki/Macroblock правого розрізу можна не помітити, якщо не зробити кодування в нижній частині ставка.
Олексій Шестацов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.