Unityの内部でどのように物体がレンダリングされるか。
流れを整理しつつ、関連するコンポーネント(CPU、GPU、Material、Mesh、Shader、Textureなど)について解説します。
CPU(Central Processing Unit)は、プログラムの実行やゲームロジック、物理演算、入力処理などの全体的な制御を行います。
描画に関しては、オブジェクトの配置情報やカメラの視点、描画指示などを管理し、最終的に描画命令をGPUに渡す役割を果たします。これには、オブジェクトの座標変換や、シェーダーに渡すデータの準備が含まれます。
GPU(Graphics Processing Unit)は、描画処理に特化したプロセッサで、大量の頂点やピクセルに対して並列計算を行います。
GPUは主に頂点シェーダーとフラグメントシェーダーを使い、画面にピクセルごとの色を計算して最終的にレンダリング結果を作り上げます。CPUが送ったデータを基にして、GPUはメッシュの頂点情報やテクスチャ、シェーダーを使って画像を描画します。
Materialは、オブジェクトの見た目を決定する要素で、シェーダーとテクスチャを組み合わせて、オブジェクトの表面がどのように描画されるかを制御するものです。シェーダーが物体の光の当たり方や質感を定義し、テクスチャはオブジェクトに貼り付けられる画像としてその外見を彩ります。Unityでは、Materialには1つ以上のテクスチャが含まれており、光の反射、透明度、メタリック感などをコントロールします。
Mesh(メッシュ)は、3Dオブジェクトの形状を定義するデータ構造で、頂点の集合とそれをつなぐ三角形ポリゴンで構成されています。頂点の座標はCPUからGPUに送られ、描画に使われます。Meshがどのような形状を持つかが、オブジェクトの基本的な「形」を決定します。これにMaterialやTextureが適用されることで、視覚的に完成されたオブジェクトになります。
Shader(シェーダー)は、GPU上で動作する小さなプログラムで、頂点やピクセルにどのような色や光の反射を与えるかを計算するためのものです。シェーダーは、Materialによって指定され、光源やカメラの位置に基づいてオブジェクトの描画結果をリアルタイムに計算します。主に以下の2つのシェーダーが使われます。
Texture(テクスチャ)は、オブジェクトの表面に貼られる画像データです。たとえば、壁のテクスチャとして、レンガ模様の画像を適用すると、オブジェクトがレンガでできているように見えます。テクスチャはシェーダーによってピクセル単位で処理され、Materialを通じてオブジェクトに適用されます。1つのオブジェクトに複数のテクスチャが貼られることもあります。
描画のプロセスは次のように進行します:
UnityのGameビューやSceneビューの右上にある「Stats」ボタンをクリックすると、描画に関する統計情報が表示されます。これにより、シーンの描画パフォーマンスを確認できます。重要な項目は以下の通りです:
Set Pass Callsは、シェーダーをGPUに適用する際に発生する命令の送信です。GPUに特定のシェーダーやテクスチャを使って描画するよう指示する際、毎回この呼び出しが行われます。たとえば、異なるマテリアルやシェーダーを使うオブジェクトを描画するたびに新たにセットアップが必要になります。この数が増えると、CPUからGPUへの描画命令が増え、パフォーマンスに悪影響を与える可能性があります。
Batchesは、同じマテリアルやシェーダーを使用するオブジェクトを一度にまとめて描画する技術・実行方法です。Unityでは、できるだけ同じ種類のオブジェクトをまとめて描画することで、描画コール(Set Pass Calls)の回数を減らし、パフォーマンスを向上させます。このプロセスを「バッチング」と呼び、Static BatchingやDynamic Batchingが用いられます。
描画の流れは、CPUが命令を整理し、GPUに渡すことで実行されます。Material、Mesh、Shader、Textureなどが連携して、3Dオブジェクトが描画されます。