今日まなび(20240824):shader レンダリング手順おさらい+QuadとかPlaneのポリゴン数いくつ?

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

今日の学び:レンダリング手順のおさらい

ポリゴン…3つの頂点から構成される
メッシュ…複数のポリゴンで形成される

まずは単純にポリゴン1つだけ描画するときのことを考える。

1:頂点の位置を決定

ポリゴン1つは3つの頂点なので、頂点の位置を決めるための処理を3回行う

2:ポリゴンの表裏を判定

ポリゴンは表裏の情報を持ち(※)、
描画負荷の軽減のため裏面を向いているポリゴンは描画しない手法がとられることが多い。
この手法を「カリングCull ing」という。

※Unityではポリゴンの表裏は頂点の定義されている順番で判断する。時計まわりに見える方向を表とする

3:ポリゴンが画面上のどの画素に描画されるか決定

ラスタライズ
1との違いがあんまりわからないが、頂点位置から実際に描画する画素を決めるということだろう

4:描画しようとしている画素にすでに別のポリゴンが描画されているか確認する

すでに描画されているポリゴンがあるかは「Zbuffer」「深度バッファ」を確認する。
これは描画する画面と同じ画素数分だけある情報で画素単位にカメラからの位置=Zを保持している。

すでに別のポリゴンが描画されている場合、ZBufferの値を参照して
新しく描画しているものの方が値が小さい=カメラに近い=手前 であるなら上書きする。奥にあると判断された場合は上書きしない。
これは画素単位に判断される。
この比較のことを「Z Test」と呼ぶ。

5:画素の色を決定する

ピクセルシェーダーで変更できる部分

6:ZBufferの値を更新

ZWriteと呼ぶ

 今日のまとめ

レンダリングはこのやって行われる

・頂点の位置決定 →頂点Shader ★かなり自由に処理を変更できる
・ポリゴンの表裏を確認して描画するか決める →カリング ☆ある程度設定を変更することは可能
・描画する画素を決定 →ラスタライズ ☆ある程度設定を変更することは可能
・深度バッファを比較してうわがきする画素を決定 →Zテスト ☆ある程度設定を変更することは可能
・画素の色を決めて描画 →ピクセルShader ★かなり自由に処理を変更できる
・深度バッファを上書き →ZWrite ☆ある程度設定を変更することは可能

QuadとかPlaneのポリゴン数いくつ?

QuadやPanelにアタッチされているMeshFilterから以下のコードでポリゴン数を算出できる。

meshFilter.sharedMesh.triangles.Length / 3`;

結果 Quad=2個 Plane=200個 だった。同じ四角でもかなり数が違うみたいだ。

<検証に使ったコード>

public class Shader20240824 : MonoBehaviour
{
    public MeshFilter meshFilter;

    // Start is called before the first frame update
    void Start()
    {
        int polygonCount = meshFilter.sharedMesh.triangles.Length / 3;
        Debug.Log("ポリゴン数=" + polygonCount + " 頂点数=" + polygonCount * 3);
    }

}

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

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