動機
一般的にカラー変換はshaderを使って、runtimeで変換する
ただ、フレーム毎に変換するのは非効率と思います
もしカラー変換の結果をtextureに記録して、そのままモデルに使う
その方が効率的だと思います
カラー変換
カラー変換について、一般的なやり方は
まずRGBをHSVに変換して、そのあとHueを弄って、最後にRGBに戻る
HSVについてはこちらを参考にさせていただきました
HSV
手順
1.textureのRGBを抽出して、HSVに変換したあと、新のtextureに保存する(以降、このtextureをHSVテクスチャと呼ぶ
// RGB空間をHSV空間へ変換する
// Alphaを変換maskとして記録する
Texture2D RGB2HSV(Texture2D fromRGB)
{
int width = fromRGB.width;
int height = fromRGB.height;
Texture2D toHSV = new Texture2D (width, height, TextureFormat.ARGB32, false);
Color[] cols = fromRGB.GetPixels();
for(int Indx = 0; Indx < cols.Length; ++Indx)
{
float h = 0f;
float s = 0f;
float v = 0f;
Color.RGB2HSV(cols[Indx], out h, out s, out v);
cols[Indx].r = h;
cols[Indx].g = s;
cols[Indx].b = v;
}
toHSV.SetPixels(cols);
toHSV.Apply();
return toHSV;
}
Color.RGB2HSVはRGBをHSVに変換する関数、変換したHSVの値は正規化した値(0.0-1.0の範囲に)
そのままRGBチャンネルに記録できます
2.HSVテクスチャのRGBを抽出して、Rチャンネル(Hue)を変換する、そのあとRGBに戻る
// HSV空間をRGB空間へ変換する
// Alphaを変換maskとして使用する
Texture2D ChangeColor(Texture2D fromHSV, float diffHue)
{
int width = fromHSV.width;
int height = fromHSV.height;
Texture2D toRGB = new Texture2D (width, height, TextureFormat.ARGB32, false);
Color[] cols = fromHSV.GetPixels();
for(int Indx = 0; Indx < cols.Length; ++Indx)
{
float h = cols[Indx].r;
if(0f < cols[Indx].a)
{
h += diffHue;
h -= Mathf.Floor(h);
}
cols[Indx] = Color.HSVToRGB (h, cols[Indx].g, cols[Indx].b);
}
toRGB.SetPixels(cols);
toRGB.Apply();
return toRGB;
}
結果
使用したモデルはGoblin robber