Unity_Lesson

描画

Unityの内部でどのように物体がレンダリングされるか。
流れを整理しつつ、関連するコンポーネント(CPU、GPU、Material、Mesh、Shader、Textureなど)について解説します。


全体の流れ

graph A[CPUがオブジェクト情報を取得] --> B[オブジェクトの座標を描画用に変換、描画命令準備] B --> C[GPUに描画命令を送信] C --> D[頂点シェーダーがメッシュの頂点をカメラ座標系に変換] D --> E[ラスタライゼーション:2Dスクリーンに投影] E --> F[フラグメントシェーダーが各ピクセルの色を計算] F --> G[描画結果がフレームバッファに保存] G --> H[スクリーンに最終的な画像を表示]


1. CPUとGPUの役割

CPUの役割

CPU(Central Processing Unit)は、プログラムの実行やゲームロジック、物理演算、入力処理などの全体的な制御を行います。

描画に関しては、オブジェクトの配置情報やカメラの視点、描画指示などを管理し、最終的に描画命令をGPUに渡す役割を果たします。これには、オブジェクトの座標変換や、シェーダーに渡すデータの準備が含まれます。


GPUの役割

GPU(Graphics Processing Unit)は、描画処理に特化したプロセッサで、大量の頂点やピクセルに対して並列計算を行います。
GPUは主に頂点シェーダーフラグメントシェーダーを使い、画面にピクセルごとの色を計算して最終的にレンダリング結果を作り上げます。CPUが送ったデータを基にして、GPUはメッシュの頂点情報やテクスチャ、シェーダーを使って画像を描画します。


2. Material、Mesh、Shader、Textureの解説

Materialとは

Materialは、オブジェクトの見た目を決定する要素で、シェーダーとテクスチャを組み合わせて、オブジェクトの表面がどのように描画されるかを制御するものです。シェーダーが物体の光の当たり方や質感を定義し、テクスチャはオブジェクトに貼り付けられる画像としてその外見を彩ります。Unityでは、Materialには1つ以上のテクスチャが含まれており、光の反射、透明度、メタリック感などをコントロールします。

Meshとは

Mesh(メッシュ)は、3Dオブジェクトの形状を定義するデータ構造で、頂点の集合とそれをつなぐ三角形ポリゴンで構成されています。頂点の座標はCPUからGPUに送られ、描画に使われます。Meshがどのような形状を持つかが、オブジェクトの基本的な「形」を決定します。これにMaterialやTextureが適用されることで、視覚的に完成されたオブジェクトになります。

Shaderとは

Shader(シェーダー)は、GPU上で動作する小さなプログラムで、頂点やピクセルにどのような色や光の反射を与えるかを計算するためのものです。シェーダーは、Materialによって指定され、光源やカメラの位置に基づいてオブジェクトの描画結果をリアルタイムに計算します。主に以下の2つのシェーダーが使われます。

Textureとは

Texture(テクスチャ)は、オブジェクトの表面に貼られる画像データです。たとえば、壁のテクスチャとして、レンガ模様の画像を適用すると、オブジェクトがレンガでできているように見えます。テクスチャはシェーダーによってピクセル単位で処理され、Materialを通じてオブジェクトに適用されます。1つのオブジェクトに複数のテクスチャが貼られることもあります。





描画の仕組み

描画のプロセスは次のように進行します:

  1. オブジェクト情報の取得(CPU)
    • Unityのレンダリングパイプラインは、シーンに存在するすべてのオブジェクトを調べ、描画する対象を決定します。CPUがこの情報を収集し、描画命令を生成します。
  2. 頂点の変換(GPU)
    • オブジェクトのMesh(頂点情報)頂点シェーダーに送られ、3D座標系内の頂点がカメラ座標系に変換されます。
  3. ラスタライゼーション(GPU)
    • 頂点が変換された後、それが画面上の2D空間に投影され、ピクセル単位で分割されます(これをラスタライゼーションと呼びます)。この過程で三角形の形状が描かれ、ピクセルシェーダーで色が計算されます。
  4. ピクセルごとの処理(GPU)
    • 各ピクセルに対してフラグメントシェーダーが実行され、色、テクスチャ、ライティングなどの要素を計算し、最終的なピクセルの色を決定します。
  5. 描画命令の実行(GPU)
    • ピクセル情報が確定したら、フレームバッファに描画結果が送られ、最終的にスクリーンに表示されます。





Unityの「Stats」画面の解説

UnityのGameビューやSceneビューの右上にある「Stats」ボタンをクリックすると、描画に関する統計情報が表示されます。これにより、シーンの描画パフォーマンスを確認できます。重要な項目は以下の通りです:


Set Pass CallsとBatchesの解説

Set Pass Callsとは

Set Pass Callsは、シェーダーをGPUに適用する際に発生する命令の送信です。GPUに特定のシェーダーやテクスチャを使って描画するよう指示する際、毎回この呼び出しが行われます。たとえば、異なるマテリアルやシェーダーを使うオブジェクトを描画するたびに新たにセットアップが必要になります。この数が増えると、CPUからGPUへの描画命令が増え、パフォーマンスに悪影響を与える可能性があります。

Batchesとは

Batchesは、同じマテリアルやシェーダーを使用するオブジェクトを一度にまとめて描画する技術・実行方法です。Unityでは、できるだけ同じ種類のオブジェクトをまとめて描画することで、描画コール(Set Pass Calls)の回数を減らし、パフォーマンスを向上させます。このプロセスを「バッチング」と呼び、Static BatchingやDynamic Batchingが用いられます。



まとめ

描画の流れは、CPUが命令を整理し、GPUに渡すことで実行されます。Material、Mesh、Shader、Textureなどが連携して、3Dオブジェクトが描画されます。


graph A[CPUがオブジェクト情報を取得] --> B[オブジェクトの座標変換、描画命令準備] B --> C[GPUに描画命令を送信] C --> D[頂点シェーダーがメッシュの頂点をカメラ座標系に変換] D --> E[ラスタライゼーション:2Dスクリーンに投影] E --> F[フラグメントシェーダーが各ピクセルの色を計算] F --> G[描画結果がフレームバッファに保存] G --> H[スクリーンに最終的な画像を表示]

流れ

公式Youtube

シェーダー