Как мне создать несколько 2D прожекторов?

12

Я ищу, чтобы создать эффект "прожектора" 2D, который позволяет прожектор на несколько объектов. Т.е. как будто несколько спрайтов держали факелы. Для одного объекта (одного прожектора) я использую технику, в которой я накладываю градиентный спрайт и получаю, чтобы центральная точка преследовала этот объект. Эта техника отлично работает для одного прожектора. Вот скриншот, чтобы проиллюстрировать, о чем я говорю:

Одиночный прожектор - Работы

Эффект прожектора с одним прожектором

Проблема, с которой я сталкиваюсь, заключается в том, что этот метод не распространяется на несколько объектов. Если я наложу другое изображение в центре внимания, я столкнусь с несколькими проблемами. Вот смоделированный скриншот:

Несколько прожекторов = проблемы

Spotlight Effect с двумя прожекторами

Наиболее очевидная проблема - видимые углы. Эту проблему можно решить, сделав изображение прожектора гигантским, чтобы охватить весь уровень, но это не так. Вторая и более сложная проблема заключается в том, что я эффективно умножаю тьму с помощью этой техники. Таким образом, каждый добавленный спрайт затемняет всех остальных. Очевидно, я неправильно подхожу к этой проблеме.

Есть идеи?


Продолжая усилия

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

Подход прозрачности

Как обсуждалось выше, проблема заключается в том, что альфа-смешение этого изображения с другим изображением не даст желаемого эффекта. Вместо этого это произведет это:

Наложение двух кругов прозрачности

Это не кажется мне проблемой смешивания вариантов. Проблема, как мне кажется, заключается в том, что в изображение такого типа встроены маска прозрачности и изображение (черный квадрат), когда они должны быть разделены.

Таким образом, вместо черного изображения со встроенной прозрачностью, я должен использовать маски прозрачности, которые используются во время выполнения против черного квадрата. При этом я все еще не могу использовать традиционную черно-белую маску прозрачности, иначе она столкнется с той же проблемой. Вот пример, на этот раз белый и черный представляют белый и черный:

Маска прозрачности

Похоже, что решением было бы применить маску прозрачности, которая сама использует прозрачность. Как то так: (зелёный = прозрачный)

Прозрачная маска с прозрачностью

Таким образом, несколько масок прозрачности можно альфа-смешивать вместе, а затем использовать в качестве маски прозрачности против черного квадрата. Вот пример двух альфа-масок прозрачности, смешанных вместе:

Две маски прозрачности с прозрачностью

Во всяком случае, это подход, над которым я работаю. Я опубликую результаты, если это работает. Чего я не знаю (в настоящее время), так это того, могу ли я использовать маску прозрачности, которая сама по себе имеет прозрачность.

Кэмерон Фредман
источник
Размышляя об этом, мне кажется, что я должен передвигать маски прозрачности и накладывать их на большую черную текстуру. Не знаю, как это будет сделано, хотя.
Кэмерон Фредман
7
Не уверен, как вы создаете или применяете свои градиенты, однако это может быть проблемой смешивания, когда, если вы используете правильное смешивание, оно будет работать нормально. Нам нужно больше информации о текстурах.
dennmat
Я использую AndEngine в качестве основы, и большая часть смешивания происходит за кулисами, хотя есть «setBlendFunction ()» .
Кэмерон Фредман
Глядя на то, на что вы ссылались, я бы сказал, что вам, вероятно, понадобится второе решение, указанное внизу или третье, если это не сработает. У меня нет четкого представления об andEngine, и у них, похоже, не было документов, возможно, если вы не можете найти свой ответ в этой теме, они могут помочь в дальнейшем, так как кажется, что они уже поигрывают со смешиванием вариантов много за кадром.
Деннмат
Хотя этот поток, кажется, в первую очередь решает вашу проблему, у вас есть версия, включающая это изменение?
Деннмат

Ответы:

3

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

  1. Начните с полностью черного массива для хранения значений освещения для каждого пикселя в сцене.
    • Ноль будет представлять область изображения без света вообще.
    • 100% будет представлять область, которая полностью пропитана дневным светом.
    • Если вы хотите получить фантазию, вы можете иметь значение выше 100% (скажем, 200%), представляющее область изображения, которая перенасыщена и размывает все в слепящий белый шарик пикселей. Беспокойтесь об этом позже, и просто ограничьте значения в пределах 0-100% в настоящее время.
  2. Для каждого источника света либо внутри экрана, либо достаточно близко к краю, который его ореол добавил бы к свету, добавьте значения света от этого источника света в массив значений света для пикселей сцены.
  3. Используйте полученный массив значений света, чтобы изменить пиксели для вашей сцены так, чтобы:
    • Пиксели, освещенные 0% света, являются черными.
    • Пиксели, освещенные на 100% светом, имеют свой нормальный цвет.
    • Другие пиксели - это цвет между ними.
    • Похоже, вы уже знаете, как сделать этот шаг, судя по вашим скриншотам.

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

  • Добавляем альфа-значения к каждому пикселю, чтобы создать массив световых значений из # 1.
  • Использование массива light-value из # 1 для разрешения окончательных цветов для пикселей из шага # 3.

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

ET
источник
Я копаю этот ответ и собираюсь дать ему шанс. Идея бликов / размытия линз для значений выше 100% также является приятным и вдохновляющим бонусом. Будет публиковать обновления с уроками, извлеченными в процессе. Спасибо, ET
Кэмерон Фредман,