Matrixcolor link

Ren’Py可以使用變換特性 matrixcolor 對圖像染色。該特性使用一個 Matrix 類或者 ColorMatrix對象作為參數。

alpha預乘 link

Ren’Py載入圖片後,會先解壓,然後將圖片複製到電腦或行動裝置的圖形處理單元(GPU)中。 複製過程中,4種色彩通道(紅、綠、藍和alpha即不透明度)的值都會進行歸一化處理,使之介於0.0與1.0之間。 在GPU系統中,1.0表示最大色彩值或完全不透明,0.0表示最小色彩值或完全透明。

Ren’Py處理的工作不僅限於此。色彩通道數值歸一化完成後,紅綠藍通道的數值會分別與alpha通道的數值相乘。 也就是說,一個純白像素的數值會是(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)。

alpha預乘系統,使Ren’Py在縮放圖片時不會出現亮度降低的問題。 因為縮放圖片常常類似於計算兩個像素色彩平均值。 假設不使用alpha預乘,我們需要處理兩個像素,一個純白像素和一個透明純黑像素——即(1.0, 1.0, 1.0, 1.0)和(0.0, 0.0, 0.0, 0.0)。 兩個像素的彩色平均值為(0.5, 0.5, 0.5, 0.5)。但這不是我們需要的,純白像素和透明純黑像素之間應該插入一個50透明度的白色,而不是50%透明度的灰色。

以這種方式儲存色彩資訊後,Ren’Py就可以在螢幕上繪製正確的結果,而不會在縮放圖像時產生問題。

使用矩陣修改色彩 link

用於修改色彩的 Matrix 對象由16個數字組成,可以寫成一個4×4的陣列形式。 這裡我們將每個數字使用一個字母代替:

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

注意這裡的字母只是代替數值,實際使用時這些都必須是真實的數值,可以直接寫死或者通過計算獲得。

這些數值將分別作用於原圖像色彩的RGBA通道,並生成新的色彩,具體方程如下:

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類 link

因為矩陣對象只是用於靜態色彩修改,對動畫無能為力。 所以能夠同時具有矩陣的功能並能接受參數輸入將會非常實用。

ColorMatrix類是一個基類,可以擴展為很多用於創建色彩矩陣的衍生類。 Ren’Py會調用ColorMatrix類的實例,並返回色彩矩陣。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

下面是Ren’Py中TintMatrix類的實現,它是一個典型的ColorMatrix派生類:

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

        # Store the color given as a parameter.
        self.color = Color(color)

    def __call__(self, other, done):

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

            # 沒有原來的顏色,我們從self.color獲取自身rgba數值
            r, g, b = self.color.rgb
            a = self.color.alpha

        else:

            # 否則,我們從self.color和other.color分別獲取rgba並進行計算結果
            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

        # alpha預乘
        r *= a
        g *= a
        b *= a

        # 返回一個矩陣對象
        return Matrix([ r, 0, 0, 0,
                        0, g, 0, 0,
                        0, 0, b, 0,
                        0, 0, 0, a ])

結構相似原則 link

在ATL中,對 matrixcolor 特性進行插值,要求使用的ColorMatrix對象具有相似結構。 這表示相同類型的ColorMatrix,使用相同順序相乘。

As an example, the following will interpolate from normal to a desaturated blue tint, and then return to normal. 下面的樣例中,會對圖像插值並轉成低飽和度的淡藍色,然後再轉回去:

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派生類 link

下面列出了Ren’Py內建的ColorMatrix派生類。

class BrightnessMatrix(value=1.0) link

matrixcolor 特性中使用,用於提高圖像亮度的ColorMatrix派生類,不修改alpha通道數值。

value

表示亮度提高的數量。該值應該介於-1到1之間。-1表示最暗,1表示最亮。

class ColorizeMatrix(black_color, white_color) link

matrixcolor 特性中使用,對黑白色可視組件染色的ColorMatrix派生類。它會根據像素彩色中的黑色或白色數值用作插值比例進行插值計算。

不對alpha通道進行操作。

使用該類時最好使用黑白圖片(或者使用 SaturationMatrix() 將飽和度降為0後的圖像),不然可能會產生奇怪的結果。

black_color, white_color

分別對應黑色和白色重映射後的兩種顏色。

(譯者註:colorize又稱“形色化”,本質上是一種色彩RGB值的重映射算法。比如入參 black_color 設置為紅色#ff0000,white_color 設置為藍色#0000ff,黑白圖片染色之後原來純黑的部分將變成紅色,原來純白的部分將變成藍色,原來灰色的部分將變為紅藍混合。原文件中這段的描述過於糾結插值算法,沒有直譯。)

class HueMatrix(value=1.0) link

matrixcolor 特性中使用,旋轉 value 度色相值的ColorMatrix派生類。value 可以是任意數值,可正可負。360度表示色相正好旋轉一圈。 不對alpha通道進行操作。

class IdentityMatrix link

matrixcolor 特性中使用,使圖像恢復原色彩和alpha值。

value

忽略。

class InvertMatrix(value=1.0) link

matrixcolor 特性中使用,反轉各色彩通道值的ColorMatrix派生類。不對alpha通道進行操作。

value

反轉比例。0.0表示完全不反轉,1.0表示完全反轉。常用於動畫。

class OpacityMatrix(value=1.0) link

matrixcolor 特性中使用,修改圖像透明度,而不修改顏色通道值的ColorMatrix派生類。

value

該值介於0.0與1.0之間,直接與原alpha通道數值相乘。

class SaturationMatrix(value, desat=(0.2126, 0.7152, 0.0722)) link

matrixcolor 特性中使用,修改圖像飽和度,而不修改alpha通道值的ColorMatrix派生類。

value

對比度調整數值,1.0表示原圖像,0.0表示變成黑白灰的圖像。

desat

該值是一個3元元組,三個數值分別控制紅綠藍通道從0飽和度置換為原飽和度圖像的曲線斜率。 預設的常量數值是基於NTSC電視信號系統中流明度(luminance)定義。由於人眼對綠色最敏感,所以降低飽和度時相比其他兩種顏色要多保留一些。

class SepiaMatrix(tint='#ffeec2', desat=(0.2126, 0.7152, 0.0722)) link

matrixcolor 特性中使用,將某個可視組件改為老照片(sepia-tone)風格的ColorMatrix派生類。等效於:

TintMatrix(tint) * SaturationMatrix(0.0, desat)
class TintMatrix(color) link

matrixcolor 特性中使用,添加圖像色調而不修改alpha通道值的ColorMatrix派生類。

color

用作添加色調的顏色。該值會作為入參傳入 Color(),可以是Color函數支持的任意類型。