SetPixelをやってみたので、せめて髪の色でも変えるのに使ってみよう。
強制的に赤とかにすると、テクスチャ側に陰影があった場合も無視してしまうので、HSV変換してやってみたい。
HSV変換はUnity標準ではないみたいで(UnityEditorにはある模様)
変換してみましたが、黒髪の場合、彩度や明度が元々低いので色調だけ変えても変化しないですね。
赤髪、金髪なら、色調変えるだけで変わりますが。
黒髪の場合は、SとVをブーストしてやる必要がある。
もっともtoon/basicシェーダーはMainColorを指定できるので、わざわざピクセルを変更しないでも、任意の色のフィルターをかけられるので、肌の色でも髪の色でも変化させられる。
ただ、色をかぶせるだけなので、服の特定色を変えようと思ったら使いにくいので、ピクセル変換する意味はあると思う。
blog.narumium.net
SetPixelにはこういう使い方もあるのね
RGBとHSVの相互変換[色見本/サンプル付き]
上記を参考にコードを書いていくつかの色で確認した。
HSVはVector3で代用した。
値の範囲は、
HSV
色相 H 0~360
彩度 S 0~100
明度 V 0~100
となってます。
使い方
Vector3 HSV = RGBtoHSV( Color.red ); Color c = HSVtoRGB( HSV );
Vector3 RGBtoHSV(Color c) { float r = c.r; float g = c.g; float b = c.b; float max = Mathf.Max(r, g, b); float min = Mathf.Min(r, g, b); float h = 0; float s = 0; float v = max; if (max != min) { if (r == max) h = 60 * (g-b) / (max - min); else if (g == max) h = 60 * (b-r) / (max - min) + 120; else h = 60 * (r-g) / (max - min) + 240; s = (max - min) / max; } if (h < 0) h += 360; return new Vector3(h, s*100, v*100); } Color HSVtoRGB(Vector3 hsv) { float h = hsv.x; float s = hsv.y; float v = hsv.z; Color c = new Color(); if (s > 100) s = 100; if (v > 100) s = 100; if (s <0) s = 0; if (v <0) s = 0; if (h == 360) h = 0; s = s / 100; v = v / 100; if(s==0) c.r = c.g = c.b = v; else { int dh = (int)Mathf.Floor(h / 60); float p = v * (1 - s); float q = v * (1 - s * (h / 60 - dh)); float t = v * (1 - s * (1-(h/60-dh))); if (dh == 0) { c.r = v; c.g = t; c.b = p; } if (dh == 1) { c.r = q; c.g = v; c.b = p; } if (dh == 2) { c.r = p; c.g = v; c.b = t; } if (dh == 3) { c.r = p; c.g = q; c.b = v; } if (dh == 4) { c.r = t; c.g = p; c.b = v; } if (dh == 5) { c.r = v; c.g = p; c.b = q; } } return c; }