Matrixcolor link

Ren'Py は matrixcolor transform プロパティーを使用した画像の再着色をサポートします。このプロパティーは Matrix または ColorMatrix オブジェクトを取ります。

Premultiplied Alpha Color link

画像がロードされると、Ren'Pyは画像を解凍し、コンピュータまたはモバイルデバイスのGPU にコピーします。コピーの一環として4つのカラーチャンネル(red, green, blue そして不透明度を表現する alpha)のそれぞれは0.0から1.0にスケールされます。このシステムでは1.0が色または透明度の最大値で、0.0はその色がないまたはピクセルが完全に透明であることを表します。

Ren'py はそれだけにとどまりません。一旦その値がスケールされると、 red, green, blue チャンネルはアルファチャンネルで乗算されます。つまり不透明な白いピクセルは (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が色をより直接扱うと発生する暗さなしで画像をスケーリングできるようにします。画像のスケーリングは2つのピクセルの平均化と同じです。直接扱うと、それぞれ (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% 不透明な白になるはずです。

Premultiplied alphaシステムでは、最初の値は同じで、結果も同じですが、(0.5, 0.5, 0.5, 0.5)が50%不透明度の白としてあらかじめ定義されています。色をこの方法で貯めることで Ren'Py はそれらをスクリーンに正確に描画でき、スケーリング時のひどい副作用がありません。

マトリックスを使用した色の変更 link

色の変更に使用される Matrix オブジェクトは16の数値で構成され、4x4のグリッドで表せます。文字を各数値に代入してこれをする方法をここに表します。

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

ここでそれらは文字で表現されていますが、これらは実際には直接与えられるまたは算出される数値です。

これらの値はオリジナルカラーのred (R), green (G), blue (B), alpha (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

これは複雑に見えますが、かなり単純な構成で、最初の行が新しい red チャンネルを作成し、2番目が新しい green チャンネルと続きます。赤と緑を入れ替えるマトリックスを作りたいなら、次のように記述します。

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

Matrix オブジェクトは静的なカラーチャンネルに最適ですが、アニメーションする色の変化には不向きです。共通のマトリックスを取ってマトリックスが媒介変数になるようにカプセル化する方法があると便利です。

ColorMatrix はMatrix を作成するいくつかのクラスによって拡張される基本クラスです。 ColorMatrix のインスタンスは Ren'Py に呼び出され、 Matrix を返します。 ColorMatrix はよく ATL に組み込まれ、matrixcolor アニメーションを可能にします。

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

ColorMatrix は ColorMatrix クラスを継承したクラスのことで、 __call__ メソッドを実装しています。このメソッドは次を引数に取ります。 :

  • 補間する以前のオブジェクトです。このオブジェクトは任意のクラスである可能性があり、以前のオブジェクトがなければ None です。

  • 0.0 から 1.0の間の値で、補間の進行度を表します。0.0が完全な old オブジェクトで、1.0が完全な new オブジェクトです。

Matrix を返します。

ColorMatrix の例として、こちらが Ren'Py の TintMatrix クラスの実装となります。

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):

            # When not using an old color, we can take
            # r, g, b, and a from self.color.
            r, g, b = self.color.rgb
            a = self.color.alpha

        else:

            # Otherwise, we have to extract from self.color
            # and other.color, and interpolate the results.
            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

        # To properly handle premultiplied alpha, the color channels
        # have to be multiplied by the alpha channel.
        r *= a
        g *= a
        b *= a

        # Return a Matrix.
        return Matrix([ r, 0, 0, 0,
                        0, g, 0, 0,
                        0, 0, b, 0,
                        0, 0, 0, a ])

組み込み ColorMatrix サブクラス link

以下は Ren'Py に組み込まれた ColorMatrix サブクラスのリストです。

BrightnessMatrix(value=1.0) link

matrixcolor でアルファチャンネルを変えずに画像の明るさを変えるのに使用される ColorMatrix です。

value

画像明度の変更量です。これは-1 から 1 の間の数値で、-1は最も暗く、1が最も明るいです。

ColorizeMatrix(black_color, white_color) link

matrixcolor で黒と白のDisplayableを着色するのに使用される ColorMatrix です。黒と白の各ピクセルの色を使用してblack_colorとwhite_colorの間で補間します。

アルファチャンネルには触れられません。

これは白黒画像( または SaturationMatrix() で彩度をなくされたもの) )への使用を意図しており、白黒以外の画像に使用するとかなり奇妙な結果になるでしょう。

black_color, white_color

補間に使用される色です。

HueMatrix(value=1.0) link

matrixcolor で色調を value 度回転するのに使用される ColorMatrix です。 value は正負どの数でもよく、360度で1周します。アルファチャンネルはそのままです。

IdentityMatrix() link

matrixcolor で色もアルファチャンネルも変更しないのに使用される ColorMatrix です。

value

無視されます。

InvertMatrix(value=1.0) link

matrixcolor で各カラーチャンネルを反転するのに使用される ColorMatrix です。アルファチャンネルはそのままです。

value

反転する量で、 0.0 は反転せず、 1.0 は完全に反転します。反転のアニメーションに使用されます。

OpacityMatrix(value=1.0) link

matrixcolor で画像の不透明度を変更するのに使用される ColorMatrix です。カラーチャンネルはそのままです。

value

アルファチャンネルに乗算される量で、0.0 から 1.0 の数値です。

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

matrixcolor で画像の彩度を変えるのに使用される ColorMatrix です。アルファチャンネルはそのままです。

value

彩度量で、 1.0 は画像が変化せず、 0.0 はグレースケールになります。

desat

これは 3 要素のタプルで、red、green、blueチャンネルが完全に彩度を無くした 3 つのチャンネルにどれだけ残るかを制御します。デフォルトはNTSC テレビジョン信号の輝度チャンネルに使われる定数に基づきます。人間の目は緑に最も敏感なので、緑チャンネルは他の 2 つのチャンネルよりも残されます。

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

matrixcolor でDisplayableをセピア調にするのに使用される ColorMatrix です。これは次と等価です。

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

matrixcolor で画像を染めるのに使用される ColorMatrix です。アルファチャンネルはそのままです。

color

matrix が染める色です。これは Color() に渡されるので Color が第一引数にサポートするすべてであり得ます。