うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】float で Color.rgb を近似する

Meshの情報を使ってShaderで色を操作する際、RGB値を渡すとfloat3が必要になりますが、多くの色を扱いたい場合はできるだけ使用する数を減らしたいですね。

そのような場合、RGBをfloatに変換し、Shader側でfloatからRGBに変換することで、完全には復元できないかもしれませんが、1つのfloatで済ませることができます。

以下がRGBをfloatに変換する処理です。

/// <summary>
/// RGBをfloatに変換 
/// </summary>
float ColorToFloat(Color color)
{
    var rgb = new Vector3Int(
        Mathf.FloorToInt(color.r * 255f + 0.5f),
        Mathf.FloorToInt(color.g * 255f + 0.5f),
        Mathf.FloorToInt(color.b * 255f + 0.5f)
    );
    float packed = rgb.x * 65536 + rgb.y * 256 + rgb.z;
    return packed / (256 * 256 * 256);
}

復元する際には、以下のようにして、ある程度似た色に戻すことができます。

half4 FloatToColor(float packed)
{
    packed *= 256 * 256 * 256;
    half3 color = half3(0, 0, 0);

    color.b = fmod(packed, 256);
    packed = floor(packed / 256);
    color.g = fmod(packed, 256);
    color.r = floor(packed / 256);
    return half4(color / 255, 1);
}

実際に利用してみた結果、色がそこまで大きくずれていないことが確認できましたね。