【Java】乗算色・スクリーン色
最終更新: 2023年1月26日
モデルに乗算色・スクリーン色を適用することで、色合いをリアルタイムに変化させることができます。
Cubism Editor上で設定した乗算色・スクリーン色はCubism4.2以降のCubism Java Frameworkを利用することで、特に追加のコーディングをすることなく適用されます。
Cubism Editor上での乗算色・スクリーン色の設定はEditorマニュアルの「乗算色・スクリーン色」を参照してください。
また必要に応じたコーディングを行うことでSDKから乗算色・スクリーン色を操作し、以下のような動作も可能になります。
- インタラクティブに乗算色・スクリーン色を適用する
- Cubism Editor上で設定していない乗算色・スクリーン色を適用する
- Cubism Editor上で設定した乗算色・スクリーン色を無効にする
以降はその手順の説明になります。
処理手順
以下の流れで処理を行います。
- 乗算色・スクリーン色の上書きフラグ設定
- 乗算色・スクリーン色の設定
- モデルの描画
乗算色・スクリーン色の上書きフラグ設定
まずは乗算色・スクリーン色の上書きフラグをtrueに設定します。デフォルトではfalseになっています。
model.getModel().setOverrideFlagForModelMultiplyColors(true); // 乗算色の上書きフラグ model.getModel().setOverrideFlagForModelScreenColors(true); // スクリーン色の上書きフラグ
public void setOverwriteFlagForModelMultiplyColors(boolean value) 及び public voidsetOverwriteFlagForModelScreenColors(boolean value) はFrameworkの CubismModel クラスに定義されています。
Cubism SDK for Java のサンプルプロジェクトではモデルを操作するために CubismModel を基底クラスとした LAppModel クラスを定義しており、上記コードの model は LAppModel クラスのインスタンスです。
LAppModel クラスから CubismModel クラスのメソッドを呼び出すために getModel() を仲介しています。
乗算色・スクリーン色の設定
乗算色・スクリーン色を定義し、モデルに設定します。
下記のコードでは全てのDrawableに対し、乗算色に赤、スクリーン色に緑を設定する場合の設定値です。
設定色はRGBAが使用できます。
for (int i = 0; i < model.getModel().getDrawableCount(); i++) { CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 乗算色 multiplyColor.r = 1.0f; multiplyColor.g = 0.5f; multiplyColor.b = 0.5f; multiplyColor.a = 1.0f; CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // スクリーン色 screenColor.r = 0.0f; screenColor.g = 0.5f; screenColor.b = 0.0f; screenColor.a = 1.0f; model.getModel().setMultiplyColor(i, multiplyColor); model.getModel().setScreenColor(i, screenColor); }
乗算色・スクリーン色適用前
乗算色に赤、スクリーン色に緑を適用後
モデルのDrawableCountでループ処理を行うことで、毎フレームに全てのDrawableに対して乗算色・スクリーン色の処理を行う形となります。
Tips
今回は全てのDrawableに同じ乗算色・スクリーン色を設定していますが、Drawableのインデックスごとに異なる乗算色・スクリーン色を設定することも可能です。 引数の i はDrawableのインデックスとなります。
Cubism Editor 上で設定した乗算色・スクリーン色を無効にする場合は、乗算色に0、スクリーン色に1を設定します。設定した場合はそれぞれの初期値になります。
CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 乗算色 multiplyColor.r = 1.0f; multiplyColor.g = 1.0f; multiplyColor.b = 1.0f; multiplyColor.a = 1.0f; CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // スクリーン色 screenColor.r = 0.0f; screenColor.g = 0.0f; screenColor.b = 0.0f; screenColor.a = 1.0f;
モデルの描画
model.draw(projection);
Cubism SDK for Javaのサンプルプロジェクトで元々行っているモデルの draw() 関数を呼び出すことで、Cubism JavaFramework内部のレンダリング処理により乗算色・スクリーン色を含んだモデルが描画されます。
その他の関連関数
乗算色・スクリーン色の上書きフラグ取得
true に設定した場合はSDKで設定した色情報を優先し、false に設定した場合はモデルの色情報を優先します。
public boolean getOverwriteFlagForModelMultiplyColors(){...} // モデル全体の乗算色上書きフラグの取得 public boolean getOverwriteFlagForScreenColors(){...} // モデル全体のスクリーン色上書きフラグの取得
また、各Drawableの個別の上書きフラグを取得することもできます。
public boolean getOverwriteFlagForDrawableMultiplyColors(int drawableIndex){...} // 指定したインデックスのDrawableの乗算色上書きフラグの取得 public boolean getOverwriteFlagForDrawableScreenColors(int drawableIndex){...} // 指定したインデックスのDrawableのスクリーン色上書きフラグの取得
乗算色・スクリーン色の設定
上記では CubismRenderer.CubismTextureColor を引数にした設定方法を記載しましたが、RGBAを直接設定できるメソッドもあります。(入力値0.0~1.0)
public void setMultiplyColor(int drawableIndex, float r, float g, float b, float a){...} // 乗算色設定 public void setScreenColor(int drawableIndex, float r, float g, float b, float a){...} // スクリーン色設定
乗算色・スクリーン色の取得
乗算色・スクリーン色の上書きフラグ取得
true に設定した場合はSDKで設定した色情報を優先し、false に設定した場合はモデルの色情報を優先します。
public boolean getOverwriteFlagForModelMultiplyColors(){...} // モデル全体の乗算色上書きフラグの取得 public boolean getOverwriteFlagForScreenColors(){...} // モデル全体のスクリーン色上書きフラグの取得
また、各Drawableの個別の上書きフラグを取得することもできます。
public boolean getOverwriteFlagForDrawableMultiplyColors(int drawableIndex){...} // 指定したインデックスのDrawableの乗算色上書きフラグの取得 public boolean getOverwriteFlagForDrawableScreenColors(int drawableIndex){...} // 指定したインデックスのDrawableのスクリーン色上書きフラグの取得
乗算色・スクリーン色の設定
上記では CubismRenderer.CubismTextureColor を引数にした設定方法を記載しましたが、RGBAを直接設定できるメソッドもあります。(入力値0.0~1.0)
public void setMultiplyColor(int drawableIndex, float r, float g, float b, float a){...} // 乗算色設定 public void setScreenColor(int drawableIndex, float r, float g, float b, float a){...} // スクリーン色設定
乗算色・スクリーン色の取得
各Drawableの乗算色・スクリーン色をCubismTextureColor型で取得します。
CubismRenderer.CubismTextureColor getMultiplyColor(int drawableIndex){...} CubismRenderer.CubismTextureColor getScreenColor(int drawableIndex){...}
引数はDrawableのインデックスとなります。
Cubism Java Frameworkの内部処理
乗算色・スクリーン色を表現するためのFrameworkの内部処理です。
以下の流れで処理を行います。
- Cubism Core Javaからモデルの乗算色・スクリーン色を取得
- 取得した乗算色・スクリーン色を上書きフラグで判別する
- 取得した乗算色・スクリーン色をシェーダープログラムに設定する
- フラグメントシェーダーにテクスチャカラー計算時に乗算色・スクリーン色を加える
Tips
Cubism Core Javaからモデルの乗算色・スクリーン色をRGBAで取得しますが、A(透明度)はCubism Editor で設定されません。
従って、乗算色・スクリーン色の計算には利用されません。
Cubism Core Javaからモデルの乗算色・スクリーン色を取得
Cubism Core Java内のCubismModelクラスのAPIを用いて、モデルから乗算色・スクリーン色の全Drawableが含まれる配列を取得します。
その配列の指定されたインデックスにアクセスしその値を返却しています。
public float[] getDrawableMultiplyColor(int drawableIndex) { return model.getDrawableViews()[drawableIndex].getMultiplyColors(); } public float[] getDrawableScreenColor(int drawableIndex) { return model.getDrawableViews()[drawableIndex].getScreenColors(); }
Core Java ではmoc3ファイルをロードした際に全Drawableの情報が取得され、メンバー配列に保持されます。
SDK側で乗算色・スクリーン色を設定する場合は setOverwriteFlagForModelMultiplyColors() 及びsetOverwriteFlagForScreenColors() にtrueを設定した上で、setMultiplyColor() 及び setScreenColor() でメンバー配列を上書きします。
特定のDrawableに対して乗算色・スクリーン色を設定する場合は setOverwriteFlagForDrawableMultiplyColors() 及びsetOverwriteFlagForDrawableScreenColors() にtrueを設定し、同様の操作を行います。
Tips
上記の処理を行うとそれ以降のDrawableの色が全て上書き色情報に設定されます。
モデル本来の設定色を再度使いたい場合は、別途処理を追加する必要があります。