描画
Unityの内部でどのように物体がレンダリングされるか。
流れを整理しつつ、関連するコンポーネント(CPU、GPU、Material、Mesh、Shader、Textureなど)について解説します。
全体の流れ
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つのシェーダーが使われます。
- 頂点シェーダー:3D空間内の頂点をカメラ座標系に変換する役割を持ち、オブジェクトの形を計算します。
- フラグメント(ピクセル)シェーダー:各ピクセルにどの色を表示するかを決定します。ライティングやテクスチャの影響もここで考慮されます。
Textureとは
Texture(テクスチャ)は、オブジェクトの表面に貼られる画像データです。たとえば、壁のテクスチャとして、レンガ模様の画像を適用すると、オブジェクトがレンガでできているように見えます。テクスチャはシェーダーによってピクセル単位で処理され、Materialを通じてオブジェクトに適用されます。1つのオブジェクトに複数のテクスチャが貼られることもあります。
描画の仕組み
描画のプロセスは次のように進行します:
-
オブジェクト情報の取得(CPU)
- Unityのレンダリングパイプラインは、シーンに存在するすべてのオブジェクトを調べ、描画する対象を決定します。CPUがこの情報を収集し、描画命令を生成します。
-
頂点の変換(GPU)
- オブジェクトのMesh(頂点情報)が頂点シェーダーに送られ、3D座標系内の頂点がカメラ座標系に変換されます。
-
ラスタライゼーション(GPU)
- 頂点が変換された後、それが画面上の2D空間に投影され、ピクセル単位で分割されます(これをラスタライゼーションと呼びます)。この過程で三角形の形状が描かれ、ピクセルシェーダーで色が計算されます。
-
ピクセルごとの処理(GPU)
- 各ピクセルに対してフラグメントシェーダーが実行され、色、テクスチャ、ライティングなどの要素を計算し、最終的なピクセルの色を決定します。
-
描画命令の実行(GPU)
- ピクセル情報が確定したら、フレームバッファに描画結果が送られ、最終的にスクリーンに表示されます。
Unityの「Stats」画面の解説
UnityのGameビューやSceneビューの右上にある「Stats」ボタンをクリックすると、描画に関する統計情報が表示されます。これにより、シーンの描画パフォーマンスを確認できます。重要な項目は以下の通りです:
- Batches: バッチ処理の数。少ないほどパフォーマンスが向上します。
- Set Pass Calls: シェーダーをGPUに送る回数。これが増えるとパフォーマンスが低下します。
- Triangles: 描画されるポリゴン(三角形)の数。多いと負荷が高くなります。
- Vertices: 頂点の数。Trianglesと同様に、数が多いほどGPUに負荷がかかります。
- FPS: フレームレート(1秒間に描画されるフレーム数)。高いほどスムーズに動作します。
Set Pass CallsとBatchesの解説
Set Pass Callsとは
Set Pass Callsは、シェーダーをGPUに適用する際に発生する命令の送信です。GPUに特定のシェーダーやテクスチャを使って描画するよう指示する際、毎回この呼び出しが行われます。たとえば、異なるマテリアルやシェーダーを使うオブジェクトを描画するたびに新たにセットアップが必要になります。この数が増えると、CPUからGPUへの描画命令が増え、パフォーマンスに悪影響を与える可能性があります。
Batchesとは
Batchesは、