Як створити кілька 2D прожекторів?


12

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

Єдиний прожектор - працює

Ефект прожектора з одним прожектором

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

Кілька прожекторів = Проблеми

Ефект прожектора з двома прожекторами

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

Будь-які ідеї?


Постійні зусилля

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

Підхід прозорості

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

Накладення двох прозорих кіл

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

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

Маска прозорості

Здається, рішенням було б застосувати маску прозорості, яка сама використовує прозорість. Приблизно так: (зелений = прозорий)

Маска прозорості з прозорістю

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

Дві маски прозорості з прозорістю

У будь-якому випадку, це такий підхід, над яким я працюю. Я опублікую результати, якщо це допоможе. Те, що я не знаю (на даний момент), це якщо я можу використовувати маску прозорості, яка сама має прозорість.


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

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

Я використовую AndEngine як основу, і значна частина сумішей відбувається за кадром, хоча є "setBlendFunction ()" .
Камерон Фредман

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

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

Відповіді:


3

Концептуально рішення декількох прожекторів складається з:

  1. Почніть з повністю чорного масиву, щоб утримувати значення освітлення для кожного пікселя в сцені.
    • Нуль буде представляти область зображення без світла.
    • На 100% буде представлена ​​територія, повністю насичена денним світлом.
    • Якщо ви хочете пофантазувати, ви можете мати значення, що перевищує 100% (скажімо, 200%) - зображення зображення, яке є перенасиченим, і розмиває все в сліпуче біле пляма пікселів. Турбуйтеся про це пізніше, і просто обмежуйте значення між 0-100% на даний момент.
  2. Для кожного джерела світла або на екрані, або достатньо близько до краю, щоб його ореол додав би світло, додайте значення світла від цього джерела світла до масиву значень світла для пікселів сцени.
  3. Використовуйте отриманий масив світлих значень для зміни пікселів для сцени таким чином:
    • Пікселі, освітлені 0% світлом, чорні.
    • Пікселі, освітлені 100% світлом, мають свій звичайний колір.
    • Інші пікселі є кольоровою частиною між ними.
    • Здається, ви вже знаєте, як зробити цей крок, судячи з ваших знімків екрану.

Хитрість полягає в розумінні того, що альфа-змішування може виконати один або кілька цих кроків. Альфа-змішування просто стосується використання альфа-карти / зображення для зміни пікселів зображення або текстури простим способом. Зазвичай це також означає, що для швидкого набору функцій це швидкий набір функцій або реалізований за допомогою спеціальних апаратних команд. Ви можете це робити за допомогою звичайних масивів та звичайних мовних команд, але використання спеціальних функцій бібліотеки альфа / змішування, ймовірно, краще. ... І не буде помилок. Іноді це означає зробити пікселі частково прозорими, але для вашого випадку це означає:

  • Додавання значень альфа до кожного пікселя для створення масиву світлових значень з №1.
  • Використання масиву світлового значення з №1 для вирішення кінцевих кольорів для пікселів із кроку №3.

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


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