こんにちは、みんな。以前の記事は 」と「 「ゲーム開発におけるリアクティブ プログラミング: Unity の詳細 。 Unity でのゲーム開発: アーキテクチャを組織するアプローチの検討 今日はUnityにおけるレンダリングとシェーダーなどについて触れていきたいと思います。シェーダー (簡単に言うと) は、ゲーム内のオブジェクトをレンダリングおよび変換する方法をビデオ カードに指示する命令です。それで、クラブへようこそ、相棒。 注意!この記事は 1 キロメートルにわたるので、2 つの部分に分けました。 Unity でのレンダリングはどのように機能しますか? の現在のバージョンには、組み込み、HDRP、URP という 3 つの異なるレンダリング パイプラインがあります。レンダリングを扱う前に、Unity が提供するレンダリング パイプラインの概念を理解する必要があります。 Unity 各レンダリング パイプラインは、より重要な操作を実行し、完全なレンダリング プロセスを形成するいくつかのステップを実行します。そして、モデル (.fbx など) をステージにロードすると、モニターに到達するまでに、まるでワシントンからロサンゼルスまで別の道を移動するかのように、長い道のりを進みます。 各レンダリング パイプラインには、使用するプロパティがあります。マテリアルのプロパティ、光源、テクスチャ、およびシェーダ内のすべての機能は、画面上のオブジェクトの外観と最適化に影響します。 では、このプロセスはどのようにして起こるのでしょうか?そのためには、レンダリング パイプラインの基本アーキテクチャについて説明する必要があります。 Unity はすべてを 4 つの段階 (アプリケーション機能、ジオメトリの操作、ラスター化、ピクセル処理) に分割します。 アプリケーション機能 関数の処理は CPU 上で開始され、シーン内で行われます。これには次のものが含まれます。 物理処理と衝突の誤計算 テクスチャアニメーション キーボードとマウスの入力 私たちのスクリプト ここで、アプリケーションはメモリに保存されたデータを読み取り、プリミティブ (三角形、頂点など) をさらに生成します。アプリケーション ステージの最後に、これらすべてがジオメトリ処理ステージに送信され、マトリックス変換を使用して頂点変換が行われます。 ジオメトリ処理 コンピューターが CPU を介して 画面に表示される画像を要求するとき、これは 2 段階で行われます。 GPU から レンダリング状態が設定され、ジオメトリ処理からピクセル処理までのステップが完了したとき オブジェクトが画面上にレンダリングされるとき ジオメトリ処理フェーズは GPU で実行され、ジオメトリの処理を担当します。 オブジェクトの頂点。このフェーズは、頂点シェーディング、投影、クリッピング、画面上での表示という 4 つのサブプロセスに分かれています。 最初のアプリケーション段階でプリミティブが正常にロードされ、アセンブルされると、それらは頂点シェーディング ステージに送られます。これには 2 つのタスクがあります。 オブジェクト内の頂点の位置を計算します。 位置を他の空間座標に変換し (例として、ローカル座標からワールド座標へ)、画面上にレンダリングできるようにします。 また、このステップでは、グラフィックスを描画する次のステップに必要なプロパティを追加で選択できます。これらには、法線、接線、UV 座標、その他のパラメータが含まれます。 投影とクリッピングは追加のステップとして機能し、シーンのカメラ設定に依存します。レンダリング プロセス全体が Camera Frustum に関連して行われることに注意してください。 投影は遠近法または正投影マッピングを担当しますが、クリッピングによりカメラ錐台の外側の余分なジオメトリをトリミングできます。 ラスタライズとピクセルの操作 ラスタライズです。これは、スクリーン上の 2D 座標に対応する投影内のピクセルを見つけることから構成されます。画面オブジェクトが占めるすべてのピクセルを見つけるプロセスは、ラスター化と呼ばれます。このプロセスは、シーン内のオブジェクトと画面上のピクセル間の同期ステップと考えることができます。 レンダリング作業の次の段階は 画面上のオブジェクトごとに次の手順が実行されます。 Triangle Setup は、オブジェクト上でデータを生成し、それをトラバーサルのために送信する役割を果たします。 Triangle Traversal は、ポリゴン グループの一部であるすべてのピクセルを列挙します。この場合、このピクセルのグループはフラグメントと呼ばれます。 すべてのデータを収集し、画面上にピクセルを表示する準備ができたら、最後のステップに進みます。この時点で、各ピクセルの可視性を担当するフラグメント シェーダが起動されます。画面上にレンダリングされる各ピクセルの色を担当します。 フォワードシェーディングとディファードシェーディング すでにご存知のとおり、Unity には組み込み、URP、HDRP の 3 種類のレンダリング パイプラインがあります。一方では、組み込み (Unity の基準をすべて満たす最も古いレンダリング タイプ) があります。逆に、より現代的で最適化された柔軟な HDRP と URP (Scriptable RP と呼ばれます) があります。 各レンダリング パイプラインにはグラフィックス処理用のパスがあり、ジオメトリの読み込みから画面上でのレンダリングまでに必要な一連の操作に対応します。これにより、照明されたシーン (たとえば、指向性のある光と風景のあるシーン) をグラフィック処理することができます。 レンダリング パスの例には、順方向パス、遅延パス、レガシー遅延およびレガシー頂点リットが含まれます。それぞれが特定の機能と制限をサポートし、そのパフォーマンスを持っています。 Unity では、フォワード パスがレンダリングのデフォルトです。これは、最も多くのビデオ カードがサポートしているためです。ただし、順方向のパスには照明やその他の機能に制限があります。 URP は順方向パスのみをサポートしますが、HDRP にはより多くの選択肢があり、順方向パスと遅延パスの両方を組み合わせることができることに注意してください。 この概念をよりよく理解するには、オブジェクトと指向性ライトがある例を考慮する必要があります。これらのオブジェクトがどのように相互作用するかによって、レンダリング パス (照明モデル) が決まります。 また、結果は次の影響を受けます。 材質特性 光源の特徴 基本的な照明モデルは、環境色、拡散反射、鏡面反射という 3 つの異なるプロパティの合計に対応します。 ライティングの計算はシェーダー内で行われます。これは頂点またはフラグメントごとに実行できます。ライティングが頂点ごとに計算される場合、それは頂点ごとのライティングと呼ばれ、頂点シェーダー ステージで実行されます。同様に、ライティングがフラグメントごとに計算される場合、それはフラグメントごとまたはピクセルごとのシェーダと呼ばれ、フラグメント (ピクセル) シェーダ ステージで実行されます。 頂点ライティングはピクセル ライティングよりもはるかに高速ですが、美しい結果を得るにはモデルに多くのポリゴンが必要であることを考慮する必要があります。 Unity の行列 それでは、レンダリング段階、より正確には頂点を操作する段階に戻りましょう。変換には行列が使用されます。行列は、特定の算術規則に従う数値要素のリストであり、コンピュータ グラフィックスでよく使用されます。 Unity では、行列は空間変換を表します。その中には次のものがあります。 UNITY_MATRIX_MVP ユニティ_マトリックス_MV ユニティ_マトリックス_V UNITY_MATRIX_P UNITY_MATRIX_VP UNITY_MATRIX_T_MV UNITY_MATRIX_IT_MV Unity_ObjectToWorld Unity_WorldToObject これらはすべて 4 行 4 列 (4x4) の行列に対応します。各行列には 4 行 4 列の数値が含まれます。マトリックスの例としては、次のオプションがあります。 前に述べたように、オブジェクトには 2 つのノード (一部のグラフィック エディタでは、それらはトランスフォームとシェイプと呼ばれます) があり、両方ともオブジェクト空間内の頂点の位置を決定します。オブジェクト空間は、オブジェクトの中心を基準としたノードの位置を定義します。 そして、オブジェクトの頂点の位置、回転、スケールを変更するたびに、各頂点にモデル マトリックス (Unity の場合 - UNITY_MATRIX_M) を乗算します。 座標をある空間から別の空間に転送してその空間内で作業するには、常に異なる行列を操作することになります。 ポリゴンオブジェクトのプロパティ ポリゴン オブジェクトの操作というテーマを続けると、3D グラフィックスの世界では、すべてのオブジェクトがポリゴン メッシュで構成されていると言えます。シーン内のオブジェクトにはプロパティがあります。それぞれには常に頂点、接線、法線、UV 座標、および色が含まれます。すべて一緒になってメッシュを形成します。これはすべて 。 シェーダによって管理されます シェーダーを使用すると、これらの各パラメーターにアクセスして変更できます。これらのパラメータを操作するときは、通常、ベクトル (float4) を使用します。次に、オブジェクトの各パラメータを分析してみましょう。 頂点 オブジェクトの頂点は、2D または 3D 空間の表面積を定義する一連の点に対応します。 3D エディタでは、頂点は通常、メッシュとオブジェクトの間の交点として表されます。 頂点は、原則として、次の 2 つの点によって特徴付けられます。 これらは変換コンポーネントの子コンポーネントです これらは、ローカル空間内の共通オブジェクトの中心に従って特定の位置を持ちます。 これは、各頂点には、そのサイズ、回転、位置を担当する変換コンポーネントと、これらの頂点がオブジェクトの中心からの相対的な位置を示す属性があることを意味します。 法線 法線は本質的に、オブジェクトのスライスの面がどこに位置するかを決定するのに役立ちます。法線は、ポリゴンの表面上の垂直ベクトルに対応し、面または頂点の方向または向きを決定するために使用されます。 接線 Unity のドキュメントを参照すると、次のような説明があります。 接線は です。 Unity の接線は Vector4 として表され、x、y、z コンポーネントがベクトルを定義し、必要に応じて従法線を反転するために w が使用されます - Unity マニュアル 、水平 (U) テクスチャ方向に沿ってメッシュ サーフェスに従う単位長ベクトル 私は一体何を読んだのでしょうか?簡単に言うと、接線は各幾何学的形状の UV の U 座標に従います。 UV 座標 多くの人が のスキンを見て、おそらく私と同じように、自分自身のスキンを描こうとしたことさえあるでしょう。そして、UV 座標はまさにこれに関連しています。これらを使用して、3D オブジェクト上に 2D テクスチャを配置できます。 『GTA Vice City』 これらの座標は、テクスチャ マップ内のどのテクセルがメッシュ内の各頂点に対応するかを制御する参照点として機能します。 UV 座標の領域は 0.0 (float) から 1.0 (float) までの範囲に等しく、「0」は開始点を表し、「1」は終了点を表します。 頂点カラー 位置、回転、サイズに加えて、頂点には色もあります。 3D ソフトウェアからオブジェクトをエクスポートすると、照明や別の色のコピーによって影響を受ける必要があるオブジェクトに色が割り当てられます。 デフォルトの頂点カラーは白 (1,1,1,1,1,1) で、色は RGBA でエンコードされます。頂点カラーを使用すると、たとえば、上の画像に示すように、テクスチャ ブレンディングを操作できます。 小さな結論 これで1部は終了です。パート 2 では、次のことについて説明します。 シェーダーとは シェーダ言語 Unity の基本的なシェーダー タイプ シェーダ構造 シェーダーラボ ブレンド Z バッファ (深度バッファ) 淘汰 CG/HLSL シェーダーグラフ ご質問がございましたら、コメント欄に残してください。