Unity で画面がレンダリングされる仕組み
1. 描画するオブジェクトの判別
- CPUがシーン内全てののオブジェクトをチェック
- レンダリングするべきか判別する
- オブジェクトのバウンディングボックスの一部がカメラの視錐台内になることが必要
- レンダリングされないオブジェクトはカリングという
2. ドローコール
- CPUはレンダリングされる全てのオブジェクト情報を収集
- 収集したデータ(オブジェクト1つ1つに対して)はドローコールと呼ばれる命令に分ける
- ドローコールには単一メッシュに関するデータと、そのメッシュがどのようにレンダリングされるべき(どのメッシュを使うか)かの情報が含まれている
3. バッチを作成
- CPUはドローコールごとにバッチと呼ばれるデータのパケットを作成
- バッチを作成する処理のことをバッチングと呼ぶ
4. ドローコールを送信
- CPUはドローコールを含む全てのバッチに対してGPUにドローコールを送信
- レンダリング環境に変更がかかる場合のみセットパスコールというコマンドが呼ばれる
- GPUがセットパスコールを受け取ったらレンダリング環境を更新
- GPUがドローコールを受け取ったらバッチを元にオブジェクトを描画し始める
5. 描画する
- GPUのタスクがセットパスコールならば、レンダリング環境を更新
- GPUのタスクがドローコールならば、メッシュをレンダリングする
- 頂点シェーダーがGPUにメッシュの頂点を処理する方法を決定
- 頂点が決まったらフラグメントシェーダーがGPUに1ピクセルごとの描画方法を決定
- CPUから送られたすべてのドローコールが処理されたらレンダリング完了
カリングについて
視錐台カリング(フラスタムカリング)
- 常に自動で行われる機能
- カメラの視錐台の中に入っているものは描画、入っていないものは描画しないというもの
-
Near clipping plane
とFar clipping plane
の間を結ぶ台形が視錐台と呼ばれる部分のこと
オクルージョンカリング
- あるオブジェクトが他のオブジェクトに隠されていて現在カメラに映らないときに、オブジェクトのレンダリングを無効にする機能
- GPUの負荷は軽減できるが、遮蔽判定をするためCPUの負荷は増加
- 遮蔽判定を負荷が⼤きすぎるため、
「セル」と呼ばれる⽴⽅体の範囲単位で事前に遮蔽判定の
計算をしておく
オクルージョンカリングの使い方は参考文献を見ると分かりやすいと思います。
Unity のライティング
- オブジェクトのシェーディングを計算するためには、そのオブジェクトに当たる光の強度、方向、色の情報が必要
ライティングの種類
- 「リアルタイム」なものと「事前計算」によるものがある
- どれを使うかは、使用するプロジェクトと対象のプラットフォームによって異なる
リアルタイムレンダリング
- シーン内のオブジェクトをライティングする最も基本的な方法
- キャラクターなどの動くジオメトリを照らすのに向いている
- Unityのリアルタイムライトは反射しない
ライトマップのベイク
- 静的で複雑なライティング効果を計算可能
- 計算結果はライトマップと呼ばれる参照テクスチャマップに保存
- この計算プロセスを**ベイク(焼き付け)**という
- サーフェスを直に照らす直接光と、シーン内にある他のオブジェクトから跳ね返ってくる間接光のどちらも含めることが可能
- ゲーム中にライトを自由に動かせなくなる代わりに、モバイル端末のような非力なハードウェアでもパフォーマンスを出せる
事前計算されたリアルタイムグローバルイルミネーション
- シーンの複雑なライティングをインタラクティブに更新する方法
- 間接光によるグローバルイルミネーションを使ってライティングされた環境を生成しつつ、リアルタイムでライティングの変更が可能
- 時刻によって光源の色と位置が変化するのを表現するのが良い例
レイヤー
参考文献