今日まなび(20240825):自分で4角形のメッシュを作成してテクスチャを張ってみる

「今日まなび」は最低1日1h、ゲーム作るために学びたいことなんでもいいから学んでいくコーナー。
完全自分用でまとめることは考えなくてOK.1記事1h。(1hでどんだけ学べるかのスピード感もみていきたいので)
1hのうちに次回学ぶことも決定しておくこと


本日はこちらの内容を学んでいきます。普段何気なく使っているQuadやPlaneのメッシュはどういう風に情報を持っているかが少しわかる nn-hokuson.hatenablog.com

今日の学び

4角形のメッシュを作成するには、ポリゴンが2つ必要になる。

・頂点
 →1ポリゴンは3つの頂点で構成される
・UV座標(テクスチャ座標)
 →頂点ごとにテクスチャのどの位置に対応するかを指定。0~1
・インデックス
 →頂点を表す番号。
 4角形を描きたい場合、ポリゴンは3角形なのでポリゴンが2つ必要になる。
 その際に2頂点は重なる。これは通常メモリの無駄使いであるため、
 別途インデックスの番号を付与して頂点配列のどの位置の情報を使うかを定義したものをインデックスと呼ぶ。
 4角形なら6頂点のうちの4頂点使うことになる。
 この値を時計まわりに見える順番で定義することによってその面が表だということを表すことができる。
 裏になっていればカリングされてしまうので順番は重要。

4角形のメッシュを生成してテクスチャを張る

using UnityEngine;

//4角形のメッシュ作ってテクスチャ張る
public class Test20240825 : MonoBehaviour
{
    public Material mat;

    void Start()
    {
        //頂点の位置
        float SIZE = 4;
        Mesh mesh = new Mesh();
        mesh.vertices = new Vector3[] {
            new Vector3 (-SIZE, -SIZE, 0), //左下
            new Vector3 (-SIZE, SIZE, 0), //左上
            new Vector3 (SIZE , -SIZE, 0),//右下
            new Vector3 (SIZE ,  SIZE, 0), //右上
        };

        //UV:頂点と画像側の位置の対応 ※0~1で定義する
        mesh.uv = new Vector2[] {
            new Vector2 (0, 0), //左下
            new Vector2 (0, 1), //左上
            new Vector2 (1, 0), //右下
            new Vector2 (1, 1), //右上
        };

        //インデックス:↑で作った頂点やUV配列のどの情報を使うか 
        //※1ポリゴン(3頂点分)時計まわりに見える順番に定義(表面という意味)する
        mesh.triangles = new int[] {
            0, 1, 2, //左下 - 左上 - 右下 の三角形
            1, 3, 2, //左上 - 右上 - 右下 の三角形
        };

        GetComponent<MeshFilter>().sharedMesh = mesh;
        GetComponent<MeshRenderer>().material = mat;


        int polygonCount = mesh.triangles.Length / 3;
        Debug.Log("ポリゴン数=" + polygonCount + " 頂点数=" + polygonCount * 3);
    }
}

TODO (調べたいこと、やりたいこととか疑問)

・Quadに影をつける
・Unityで深度バッファの値をどうやって取得できる?
・法線マップを扱う
・shaderで図形描いたりするのによく使う関数と使い方まとめ