iOS: кнопка сглаживания Эффект свечения путем наложения изображений - PullRequest
3 голосов
/ 29 апреля 2011

Я создаю пользовательскую кнопку, которая должна светиться в разной степени

diamonds

Как бы я использовал эти картинки, чтобы сделать кнопку, которая «светится» алмазом при его нажатии, и чтобы это свечение постепенно возвращалось в инертное состояние?

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

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


Мои запутанные усилия до сих пор ... (Я удалю все это или перенесу его, возможно, в несколько ответов, когда решение развернется ...)

Я вижу 3 возможных пути решения:

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

  • базовая графика и базовая анимация для выполнения смешивания

    chroma-key masking документация продолжает говорить

    Все, что находится под неокрашенными образцами, например, текущий цвет заливки или другой рисунок, просвечивает.

    , поэтому я могу маскировать хроматический ключ левым изображением, установив {0,0,0}, т.е. черный как ключ.

    это, по крайней мере, обеспечивает прозрачный фон, теперь мне нужно сделать его желтым, а не серым.

    поэтому, возможно, я мог бы начать с установки желтого цвета спины для контекста изображения, а затем с помощью некоторого CGContextSetBlendMode (...) напечатать бриллиант на желтом, ТО использовать маскировку с помощью хроматических клавиш для получения прозрачного фона 1043 *

    хорошо, это охватывает, по крайней мере, получение основного неосвещенного изображения на экране

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

    Единственная проблема с этим заключается в том, что это много тяжелого смешивания в реальном времени

    так что, возможно, я мог бы заранее рассчитать каждое изображение в анимации ... это выглядит все более и более грязным ...

  • Cocos2D

    если это позволяет мне установить режим смешивания на аддитивное смешивание, тогда я мог бы просто скомбинировать светящееся изображение поверх исходного изображения с соответствующей настройкой Альфа.

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

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

Мне нужно будет передать равномерное значение glow_factor в шейдер

Может показаться, что очевидным решением будет просто использовать

r,g,b = in_r,g,b * { (1 - glow_factor) * inertPixel + glow_factor * shinyPixel }

(где inertPixel - соответствующий пиксель инертного ромба и т. Д.)..

Похоже, я бы тоже хорошо сделал свои собственные блестки и добавил их поверх;камень должен искриться белым независимо от его характерного цвета.

0 голосов
/ 15 июня 2011

Посмотрев на эту проблему немного больше, я вижу несколько решений

Решение A - сохранить переход от свечения = 0 до свечения = 1 как 60 кадров в памятизатем загружайте соответствующий кадр в текстуру GL каждый раз, когда это требуется.

это имеет очевидное преимущество в том, что графический дизайнер может создать всю последовательность, и я могу загрузить ее в виде набора файлов PNG.

еще одним преимуществом является то, что эти кадры не нужно воспроизводить последовательно ... соответствующий кадр можно выбирать «на лету»

, однако, он имеет потенциальный недостаток - многодля отправки данных RAM-> VRAM

это можно оптимизировать с помощью glTexSubImage2D;несколько кадров могут быть отправлены одновременно, а затем распакованы изнутри GL ... на самом деле, может быть, вся последовательность.если это так, то имеет смысл использовать сжатие текстур PVRT.

iOS: воспроизведение покадровой анимации в оттенках серого в произвольном цвете

Решение B - загрузить изображения свечения = 0 и свечения = 1 в качестве текстур GL и вручную написать код шейдера, который принимает коэффициент свечения как единообразное и выполняет смешивание

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

Решение C - установите glBlendMode для выполнения аддитивного смешивания.
, затем нарисуйте изображение свечения = 0,например, установите alpha = 0,2 для каждой вершины.
, затем нарисуйте изображение с изображением свечения = 1, например, установите alpha = 0,8 для каждой вершины.

это дает преимущество в том, что этого можно достичь с помощью более общего кодаструктура - то есть очень общий класс 'Draw Texture Quad / Sprite'.

Недостаток в том, что без какой-либо обертки это немного грязно ... в моей игре у меня есть пара десятков бриллиантов -в любое время может быть 2 или 3, вероятно, светятся.таким образом, при первом проходе я рендерил ВСЕ (просто нужно правильно установить альфу для всего, что светится), а затем во втором проходе я мог бы снова нарисовать светящийся спрайт с соответствующей альфой для всего, что светится.


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

...