うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】Shader で三角関数の値をテクスチャから読み込む

三角関数はもっと遅い - Vitalabolove 店長の雑記帳

上記のサイトを見ていただければ分かるように 三角関数 の計算は遅い
なので Shader で利用する際には使いすぎないように注意しようと言われている

だから テクスチャ の rgb に sin, cos, tan の結果を書き込み
ロードして利用すればいいのではということで試してみた

テクスチャは 2のべき乗がいいので 1 × 512 のサイズで作成する

var texture = new Texture2D(512, 1, TextureFormat.RGB24, false);
for (int v = 0; v < 512; v++)
{
    texture.SetPixel(v, 0, new Color(
        (Mathf.Sin(1 / 512f * v * 360) + 1) / 2,
        (Mathf.Cos(1 / 512f * v * 360) + 1) / 2,
        (Mathf.Tan(1 / 512f * v * 360) + 1) / 2)
);
}
 
texture.Apply(false, false);

こうしてできたテクスチャがこちら

f:id:hacchi_man:20200703233509p:plain:h10

このテクスチャを利用したShaderを書いてみる
この際半分は 三角関数のメソッドを呼び出す

            fixed4 frag (v2f_img i) : SV_Target
            {
                if (i.uv.y > 0.5)
                {
                    return fixed4(
                    sin(i.uv.x * 360),
                    cos(i.uv.x * 360),
                    tan(i.uv.x * 360),
                    1
                   );
                }
                return tex2D(_MainTex, float2(i.uv.x, 0)) * 2.0 - 1.0;
            }

結果はこのようになります

f:id:hacchi_man:20200703234243p:plain:w300

360分割をしたわけじゃないので少しずれてしまっていますが許容範囲ということで

f:id:hacchi_man:20200703234326p:plain:w300