Свойство matrixcolor (Matrixcolor)
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" на английском языке.
На главную страницу | Официальная документация движка | Вернуться к началу статьи |