Я ищу, чтобы создать эффект "прожектора" 2D, который позволяет прожектор на несколько объектов. Т.е. как будто несколько спрайтов держали факелы. Для одного объекта (одного прожектора) я использую технику, в которой я накладываю градиентный спрайт и получаю, чтобы центральная точка преследовала этот объект. Эта техника отлично работает для одного прожектора. Вот скриншот, чтобы проиллюстрировать, о чем я говорю:
Одиночный прожектор - Работы
Проблема, с которой я сталкиваюсь, заключается в том, что этот метод не распространяется на несколько объектов. Если я наложу другое изображение в центре внимания, я столкнусь с несколькими проблемами. Вот смоделированный скриншот:
Несколько прожекторов = проблемы
Наиболее очевидная проблема - видимые углы. Эту проблему можно решить, сделав изображение прожектора гигантским, чтобы охватить весь уровень, но это не так. Вторая и более сложная проблема заключается в том, что я эффективно умножаю тьму с помощью этой техники. Таким образом, каждый добавленный спрайт затемняет всех остальных. Очевидно, я неправильно подхожу к этой проблеме.
Есть идеи?
Продолжая усилия
Там было некоторое обсуждение вариантов смешивания в комментариях. Вот мое нынешнее мышление. В моем приведенном выше примере с одним прожектором я использую файл изображения, который выглядит примерно так: (я заменил прозрачность зеленым цветом, чтобы его было легче проиллюстрировать)
Как обсуждалось выше, проблема заключается в том, что альфа-смешение этого изображения с другим изображением не даст желаемого эффекта. Вместо этого это произведет это:
Это не кажется мне проблемой смешивания вариантов. Проблема, как мне кажется, заключается в том, что в изображение такого типа встроены маска прозрачности и изображение (черный квадрат), когда они должны быть разделены.
Таким образом, вместо черного изображения со встроенной прозрачностью, я должен использовать маски прозрачности, которые используются во время выполнения против черного квадрата. При этом я все еще не могу использовать традиционную черно-белую маску прозрачности, иначе она столкнется с той же проблемой. Вот пример, на этот раз белый и черный представляют белый и черный:
Похоже, что решением было бы применить маску прозрачности, которая сама использует прозрачность. Как то так: (зелёный = прозрачный)
Таким образом, несколько масок прозрачности можно альфа-смешивать вместе, а затем использовать в качестве маски прозрачности против черного квадрата. Вот пример двух альфа-масок прозрачности, смешанных вместе:
Во всяком случае, это подход, над которым я работаю. Я опубликую результаты, если это работает. Чего я не знаю (в настоящее время), так это того, могу ли я использовать маску прозрачности, которая сама по себе имеет прозрачность.
Ответы:
Концептуально решение для нескольких прожекторов состоит из:
Хитрость заключается в понимании того, что альфа-смешение может выполнить один или несколько из этих шагов. Альфа-смешение - это просто использование альфа-карты / изображения для простого изменения пикселей изображения или текстуры. Это также обычно означает, что это будет быстрый набор функций или реализованный с помощью специальных аппаратных команд, чтобы сделать его быстрым. Вы можете сделать это с обычными массивами и командами на нормальном языке, но лучше использовать специальные функции библиотеки альфа / смешивания. ... и не будет ошибок. Иногда это означает сделать пиксели частично прозрачными, но для вашего случая это будет означать:
Я бы начал искать документацию по вашим альфа-функциям смешивания, чтобы увидеть, какие функции они предоставляют для объединения пикселей разного типа. Я подозреваю, что у них будут функции для каждого из шагов, которые вам нужно выполнить, но они могут быть под именами, которые не очевидны.
источник