# unity03. Practices ________________________________________ ## 1. Unity URPの描画関連のFAQ ________________________________________ ### 1.1. Batching ドローコールのバッチ処理 - Unity マニュアル https://docs.unity3d.com/ja/2022.3/Manual/DrawCallBatching.html Batching関連の一般概念や一般用語は、「2.1. 描画用語」を参照の事 ________________________________________ ### 1.2. Linear色空間とAlphaBlend Linear色空間では、なぜかAlphaBlendに余計なガンマ補正が入る - 画像編集ソフト上と同じ値にしても差が出る - 半透明の画像を重ねる場合は注意 - 通常より輝度が高くなる - 傾向としては暗い状態の幅が少なく極端になる ________________________________________ ### 1.3. Screen space - Camera と ポストプロセス Screen space - Cameraはポストプロセスの影響を受ける - Tonemappingによる余計な補正が入る - 真っ白な表示が207や208程度のグレーまで暗くなる ________________________________________ ## 2. 描画の基礎 ________________________________________ ### 2.1. 描画用語 Draw Call - Draw Callは描画の最小単位。CPUからGPUへ描画指示を出す単位 - 例えばDirect3D(=PC向けビルド)ならば、1回のpMesh->DrawSubsetなど - スプライトはそもそもID3DXSpriteがヘルパ - 実際にはpSprite->Drawの時点はDraw Callしていない - pSprite->End()にて、Begin()~End()間で使用されたTexture等でDraw Callが決まる - 例えばMetal(=iOS向けビルド)ならば、1回のdrawIndexedPrimitivesなど - これらの低レベルAPIは、基本的にバッチング機能は内蔵していない Set Pass Call - Draw Callをひとまとめにできない際のパラメータ切り替え処理 - CPU側で行う処理で、コストが高い - Unityにおいては以下 - 「シェーダ/テクスチャ/マテリアル/メッシュ/GPU State」いずれかが異なる際の切り替え処理 - ただしSRP Batcherでは、シェーダバリアントさえ同じなら1つのSet Pass Callで処理できる Batching - 描画コストを削減するためのアプローチ - Unityでは3つの異なるアプローチが実現されている - 1つ目は、Set Pass Callを減らすように描画順を並べ替える - 2つ目は、位置だけ異なり他が同一の頂点バッファ配列同士を、予め1つにまとめる - 単一のDraw Callにしてしまおうという発想 - 3つ目は、Spriteヘルパの仕組みそのもの。Sprite Batching Sprite - 2Dを描画する仕組みまたはヘルパ、あるいはそれによって描画される1つ1つの画像の事 - 例えばDirect3Dでは、2Dを描画するためのヘルパとしてSprite関連のAPIがある - Unityにおいては、2D画像に特定の設定をしたAssetの事もSpriteと呼ぶ Sprite Atlas - CG技術の古典からある手法 - 複数の画像を単一のテクスチャで用意すれば単一のDraw Callにできる、というもの - 例えばDirect3DのSpriteヘルパは、この手法を内蔵している ________________________________________ ### 2.2. 3Dの基礎 古典的なレンダリングパイプライン 1. 入力アセンブリ(頂点やインデックスのフォーマット定義) 2. 頂点処理 1. ワールド変換 2. ビュー変換(カメラ変換) 3. プロジェクション変換(視錐台/frustum変換) 3. クリッピング(カリング) 4. ビューポート変換 5. ラスタライズ等 1. ラスタライズ(フラグメント化、補間計算) 2. ピクセル処理(ピクセルシェーダ実行、Zテスト、アルファテスト、ステンシルテスト) 3. Zバッファ更新 6. 出力マージ(ブレンディング・バッファ書き込み) 7. ポストプロセス URPがカスタマイズ可能な部分の例 1. 根本的なレンダリング順のソート(RenderQueueの変更、SRPでの制御) 2. ラスタライズ周辺の処理 1. フラグメントシェーダの切替 2. Zバッファ、ステンシルバッファの切替(アウトライン処理や半透明処理の専用化など) 3. ポストプロセスの制御 4. カメラごとに上記を切替 5. Zプリパスの活用 6. Gバッファ的な活用 ※ Unityにおいては、ピクセルシェーダ≒フラグメントシェーダであり、用語の意味に差はほぼない 歴史的には別の経緯で発生した機能 ________________________________________ ## 3. 頻出アセットやライブラリ ________________________________________ ### 3.1. 公式ツール - Addressables - 2D Sprite - Post Processing - TextMeshPro - Visual Studio Tools for Unity (Visual Studio Editor) ________________________________________ ### 3.2. 定番サードパーティ DOTWeen Free https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676 UniTask https://github.com/Cysharp/UniTask