Свойство matrixcolor (Matrixcolor)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Ren'Py поддерживает перекрашивание изображений с помощью cвойства преобразования matrixcolor. Это свойство может принимать Matrix или объект ColorMatrix.

Цвет, предварительно умноженный на альфу (Premultiplied Alpha Color)[править | править код]

При загрузке изображения Ren'Py распаковывает его, а затем копирует на графический процессор вашего компьютера или мобильного устройства. В процессе копирования каждый из четырех цветовых каналов (красный, зелёный, синий и альфа-канал - альфа означает непрозрачность) масштабируется до числа от 0.0 до 1.0. В этой системе 1.0 означает полный уровень цвета или полную непрозрачность, а 0.0 - отсутствие цвета или полностью прозрачный пиксель.

На этом Ren'Py не останавливается. После масштабирования значений красный, зелёный и синий каналы умножаются на альфа-канал. Это означает, что непрозрачный белый пиксель будет иметь значение (1.0, 1.0, 1.0, 1.0, 1.0), 50% прозрачный красный пиксель будет иметь значение (0.5, 0.0, 0.0, 0.5), а прозрачный пиксель будет иметь значение (0.0, 0.0, 0.0, 0.0).

Предварительно умноженный альфа-канал позволяет Ren'Py масштабировать изображения вверх и вниз, не вызывая тёмных артефактов, возникающих из-за более точного представления цветов. Масштабирование изображений похоже на усреднение двух пикселей. Без предварительного умножения альфа-канал мы могли бы иметь сплошной белый пиксель и прозрачный пиксель - (1.0, 1.0, 1.0, 1.0, 1.0) и (0.0, 0.0, 0.0, 0.0), соответственно. Если их усреднить, то получится (0.5, 0.5, 0.5, 0.5, 0.5). Но это неправильно - усреднение сплошного белого и прозрачного черного должно дать 50% непрозрачного белого, а не 50% непрозрачного серого.

В предварительно умноженной альфа-системе начальное значение такое же, как и результат - только теперь (0.5, 0.5, 0.5, 0.5, 0.5) предварительно определено как 50% непрозрачный белый. Храня цвета таким образом, Ren'Py может правильно отображать их на экране и не получать странных артефактов при масштабировании.

Использование матрицы для изменения цветов (Using a Matrix to Change Colors)[править | править код]

Объекты Matrix, используемые для изменения цвета, могут состоять из 16 чисел, которые, в свою очередь, можно расположить в сетке 4x4. Вот способ сделать это, присваивая букву каждому номеру:

define mymatrix = Matrix([ a, b, c, d,
                           e, f, g, h,
                           i, j, k, l,
                           m, n, o, p, ])

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

Эти значения применяются к красному (R), зелёному (G), синему (B) и альфа (A) каналам исходного цвета, чтобы получить новый цвет (R', G', B', A'). Для этого используются следующие формулы:

R' = R * a + G * b + B * c + A * d
G' = R * e + G * f + B * g + A * h
B' = R * i + G * j + B * k + A * l
A' = R * m + G * n + B * o + A * p

Это может показаться сложным, но здесь довольно простая структура - первая строка создаёт новый красный канал, вторая - новый зеленый и так далее. Таким образом, если бы мы хотели создать матрицу, которая по какой-то причине меняла местами красный и зеленый каналы, мы бы написали:

transform swap_red_and green:
    matrixcolor Matrix([ 0.0, 1.0, 0.0, 0.0,
                         1.0, 0.0, 0.0, 0.0,
                         0.0, 0.0, 1.0, 0.0,
                         0.0, 0.0, 0.0, 1.0, ])

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

Класс ColorMatrix (ColorMatrix)[править | править код]

Хотя объекты Matrix подходят для статического изменения цвета, они бесполезны для анимации изменений цвета. Также полезно иметь возможность взять обычные матрицы и инкапсулировать их таким образом, чтобы матрицу можно было параметризовать.

ColorMatrix - базовый класс, который расширяется рядом классов, создающих матрицы. Экземпляры ColorMatrix вызываются Ren'Py и возвращают матрицы. ColorMatrix хорошо интегрирован с ATL, что позволяет использовать анимацию матричных цветов.

transform red_blue_tint:
    matrixcolor TintMatrix("#f00")
    linear 3.0 matrixcolor TintMatrix("#00f")
    linear 3.0 matrixcolor TintMatrix("#f00")
    repeat

Класс ColorMatrix может быть разделён на подклассы, при этом подклассы заменяют его метод __call__. Этот метод принимает:

  • Старый объект для интерполяции. Этот объект может быть любого класса и иметь значение None, если старого объекта не существует.
  • Значение между 0.0 и 1.0, представляющее точку для интерполяции. 0.0 - это полностью старый объект, а 1.0 - полностью новый объект.

И должен вернуть Matrix.


В качестве примера ColorMatrix здесь приведена реализация класса TintMatrix в Ren'Py.

class TintMatrix(ColorMatrix):
    def __init__(self, color):

        # Сохраняет цвет, заданный в качестве параметра.
        self.color = Color(color)

    def __call__(self, other, done):

        if type(other) is not type(self):

            # Когда не используется старый цвет, мы можем взять
            # r, g, b, и a из self.color.
            r, g, b = self.color.rgb
            a = self.color.alpha

        else:

            # Иначе мы должны извлечь данные из self.color
            # и other.color, и интерполировать результаты.
            oldr, oldg, oldb = other.color.rgb
            olda = other.color.alpha
            r, g, b = self.color.rgb
            a = self.color.alpha

            r = oldr + (r - oldr) * done
            g = oldg + (g - oldg) * done
            b = oldb + (b - oldb) * done
            a = olda + (a - olda) * done

        # Чтобы правильно работать с предварительно умноженной альфой, цветовые каналы
        # должны быть умножены на альфа-канал.
        r *= a
        g *= a
        b *= a

        # Возвращает Matrix.
        return Matrix([ r, 0, 0, 0,
                        0, g, 0, 0,
                        0, 0, b, 0,
                        0, 0, 0, a ])

Структурное сходство (Structural Similarity)[править | править код]

В ATL интерполяция свойства matrixcolor требует использования матриц ColorMatrix со структурным сходством. Это означает, что одни и те же типы ColorMatrix, перемноженные вместе в том же порядке.

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

show eileen happy at center:
    matrixcolor TintMatrix("#ffffff") * SaturationMatrix(1.0)
    linear 2.0 matrixcolor TintMatrix("#ccccff") * SaturationMatrix(0.0)
    linear 2.0 matrixcolor TintMatrix("#ffffff") * SaturationMatrix(1.0)

Хотя первая настройка matrixcolor может показаться ненужной, она необходима для обеспечения базы для первой линейной интерполяции. Если бы его не было, эта интерполяция была бы пропущена.

Встроенные подклассы ColorMatrix (Built-In ColorMatrix Subclasses)[править | править код]

Ниже приведён список подклассов ColorMatrix, встроенных в Ren'Py.

BrightnessMatrix(value=1.0)
ColorMatrix, который можно использовать с matrixcolor для изменения яркости изображения, оставив только альфа-канал.
value
Величина изменения яркости изображения. Это должно быть число от -1 до 1, при этом -1 - самое тёмное изображение, а 1 - самое яркое.


ColorizeMatrix(black_color, white_color)
ColorMatrix, который можно использовать с matrixcolor для раскрашивания чёрно-белых изображений. Использует цвет каждого пикселя в чёрно-белом изображении для интерполяции между черным и белым цветами.
Альфа-канал не затрагивается.
Предназначен для использования с чёрно-белым изображением (или изображением, которое было обесцвечено с помощью SaturationMatrix()) и будет давать странные результаты при использовании с изображениями, которые не являются чёрно-белыми.
black_color, white_color
Цвета, используемые при интерполяции.


ContrastMatrix(value=1.0)
ColorMatrix, который можно использовать с matrixcolor для изменения яркости изображения, оставив только альфа-канал.
value
Значение контрастности. Значения от 0.0 до 1.0 уменьшают контрастность, а значения выше 1.0 увеличивают её.


HueMatrix(value=1.0)

Источник[править | править код]

Статья "Matrixcolor" на английском языке.


На главную страницу Официальная документация движка Вернуться к началу статьи