mcpField
U
unity-graphics

unity-graphics

github.com/nice-wolf-studio開発4041 回インストール6 週間前に更新
リポジトリ

unity-graphics について

Unity のグラフィックス開発者向けに、レンダーパイプライン、シェーダー、マテリアル、カメラ、最適化を扱うリファレンススキルです。Built-in、URP、HDRP の用途や制約も比較します。

主な機能

  1. 01Built-in、URP、HDRP の比較
  2. 02Shader Graph と HLSL のガイド
  3. 03マテリアル、テクスチャ、カメラの資料
  4. 04Render Graph とレンダリング最適化

活用シーン

  1. 01新規プロジェクトのパイプライン選定
  2. 02Unity シェーダーの作成やデバッグ
  3. 03ポストプロセスとカメラの設定
  4. 04ドローコールと描画処理の最適化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nice-wolf-studio/unity-claude-skills --skill unity-graphics

インストール後、Claude Code で/unity-graphicsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
hdrp-guide.md
materials-textures.md
shader-graph.md
urp-guide.md

詳細

Unity のグラフィックスとレンダリング

レンダーパイプライン選択ガイド

レンダーパイプラインは、シーンの内容を画面に表示するための一連の処理を実行します。Unity には、次の 3 つのレンダーパイプラインがあります。

基準ビルトインレンダーパイプラインUniversal Render Pipeline (URP)High Definition Render Pipeline (HDRP)
対象レガシープロジェクトモバイルからハイエンドのコンソール/PC までAAA、自動車、建築
カスタマイズ限定的スクリプト可能、Renderer Features で拡張可能スクリプト可能、Custom Passes、Full Frame Settings
レンダリングパスフォワード、ディファードフォワード、Forward+、ディファードフォワード、ディファード(ハイブリッドのタイル/クラスター)
シェーダー作成ShaderLab + Surface ShadersShader Graph(推奨)、HLSLShader Graph(推奨)、HLSL
SRP Batcherいいえはいはい
レイトレーシングいいえいいえはい(DXR)
ボリュメトリクスいいえいいえはい(フォグ、雲)
アンチエイリアスMSAAFXAA、SMAA、TAA、MSAAFXAA、SMAA、TAA、MSAA
プラットフォームすべてすべて(スケーラブル)ハイエンド(DX11/12、Metal、Vulkan)
GPU 要件標準標準コンピュートシェーダー対応

選択の流れ:

  1. レイトレーシング、ボリュメトリックな雲、または物理ベースの空が必要ですか? --> HDRP
  2. モバイル、WebGL、または最も幅広いプラットフォームを対象にする必要がありますか? --> URP
  3. 移行予算がなく、レガシープロジェクトを維持していますか? --> ビルトイン
  4. 新しいプロジェクトを始めますか? --> URP(ほとんどのプロジェクト)または HDRP(高忠実度)

警告: レンダーパイプラインは互換性がありません。あるパイプラインのマテリアル、シェーダー、ポストプロセスは、変換しない限り別のパイプラインでは動作しません。ビルトインのマテリアルを URP/HDRP にアップグレードするには、パイプラインのマテリアルアップグレーダーが必要です。シェーダーに互換性がないオブジェクトは、明るいピンク色で描画されます。

出典:Render Pipelines

URP(Universal Render Pipeline)

URP は、モバイルからハイエンドのコンソールや PC まで、幅広いプラットフォームで最適化されたグラフィックスを作成するために Unity が開発した、事前構築済みの Scriptable Render Pipeline です。

主な機能:

  • フォワード、Forward+、ディファードのレンダリングパス
  • アンチエイリアス:FXAA、SMAA、TAA、MSAA
  • 2D ゲーム用の 2D Renderer
  • カスタムレンダリングを挿入する Renderer Features
  • ドローコールを最適化する SRP Batcher
  • Volume システムによる組み込みのポストプロセス

参照:references/urp-guide.md 出典:URP

HDRP(High Definition Render Pipeline)

HDRP は、ハイエンドのハードウェアで AAA 品質のゲーム、自動車のデモ、建築ビジュアライゼーションを対象とする、事前構築済みの Scriptable Render Pipeline です。コンピュートシェーダーに対応した GPU(DirectX 11/12、Metal、Vulkan)が必要です。

主な機能:

  • 物理ライト単位を使用した物理ベースのライティング
  • マテリアルの種類:Lit、StackLit、Layered Lit、Hair、Fabric、Eye、AxF、Terrain
  • レイトレーシング:反射、GI、シャドウ、AO、サブサーフェス散乱
  • ボリュメトリックフォグとボリュメトリックな雲
  • 物理ベースの空、HDRI Sky、Gradient Sky
  • デノイズ処理を伴うパストレーシング(Optix、Intel Open Image Denoise)
  • コースティクスと水中レンダリングに対応した水システム
  • DLSS、FSR 1.0、TAA Upscaling による動的解像度

参照:references/hdrp-guide.md 出典:HDRP

シェーダーグラフ

Shader Graph では、コードを書く代わりに、グラフフレームワーク内でノードを作成して接続することで、視覚的にシェーダーを構築できます。変更は即座に反映されます。

レンダーパイプラインの互換性:

パイプライン対応
URPはい
HDRPはい
Built-in Render Pipelineはい
Custom SRPいいえ

URP または HDRP をインストールすると、Shader Graph も自動的に含まれます。

Custom Function Node -- Shader Graph にカスタム HLSL コードを挿入します:

  • 文字列モード:HLSL を直接記述します。half/float には $precision トークンを使用します
  • ファイルモード:インクルードガードを含む外部の .hlsl ファイルを参照します
// File mode example with include guards
//UNITY_SHADER_NO_UPGRADE
#ifndef MYHLSLINCLUDE_INCLUDED
#define MYHLSLINCLUDE_INCLUDED

void MyFunction_float(float3 A, float B, out float3 Out)
{
    Out = A + B;
}
#endif //MYHLSLINCLUDE_INCLUDED

Custom Function ノードでのパイプライン検出:

#ifdef SHADERGRAPH_PREVIEW
    half3 color = half3(0,0,0);
#else
    #if defined(UNIVERSAL_PIPELINE_CORE_INCLUDED)
        half4 shadowCoord = TransformWorldToShadowCoord(WorldPosition);
        Light mainLight = GetMainLight(shadowCoord);
        half3 color = mainLight.color;
    #else
        half3 color = half3(0, 0, 0);
    #endif
#endif

パイプラインごとの条件付きキーワード:

  • Built-in:BUILTIN_PIPELINE_CORE_INCLUDED
  • URP:UNIVERSAL_PIPELINE_CORE_INCLUDED
  • HDRP:UNITY_HEADER_HD_INCLUDED
  • プレビューウィンドウ:SHADERGRAPH_PREVIEW

参照:references/shader-graph.md 出典:Shader Graph

シェーダー

シェーダーは GPU 上で実行されるプログラムです。Unity ではシェーダーを次の 3 種類に分類しています:

  1. グラフィックスパイプラインシェーダー -- 最も一般的です。Shader オブジェクトと連携して、シーンの外観を決定します
  2. コンピュートシェーダー -- 通常のグラフィックスパイプラインの外で GPU 計算を実行します
  3. レイトレーシングシェーダー -- レイトレーシングの計算を処理します(HDRP のみ)

主な用語:

  • Shader Object -- シェーダープログラムと GPU 命令をラップする Shader クラスのインスタンス
  • ShaderLab -- Shader オブジェクトの構造を定義する Unity の言語
  • Shader Graph -- コードを使わずにシェーダーを作成するビジュアルツール
  • Shader Asset -- Shader オブジェクトを定義する .shader ファイル
  • HLSL -- シェーダーコードブロック内で使用される High Level Shader Language

サーフェスシェーダー(Built-in パイプラインのみ):

  • ライティングに反応するシェーダーを簡潔に記述できます
  • 頂点/ピクセルシェーダーとレンダリングパスを自動生成します
  • URP または HDRP ではサポートされていません。代わりに Shader Graph を使用してください

ShaderLab の HLSL:

  • HLSLPROGRAM ディレクティブを使用して、Pass ブロックにシェーダーコードを追加します
  • シェーダー変数とメッシュの頂点データを接続する構造体を宣言します
  • コンパイルを制御するには #pragma ディレクティブを使用します
  • モバイル向けの最適化として 16 ビット精度をサポートします

出典:Shaders Introduction

マテリアルとテクスチャ

マテリアルとシェーダーが連携して、シーンの外観を定義します。

マテリアル

主なワークフロー:

  • マテリアルアセットを作成し、GameObject に割り当てます
  • スクリプトを使って実行時にマテリアルのプロパティを変更します
  • 大規模なマテリアルコレクションの管理には Material Variants を使用します
  • ピンク色の描画を防ぐため、Built-in マテリアルを URP/HDRP にアップグレードします

Material API -- 主なプロパティとメソッド:

プロパティ/メソッド用途
colorマテリアルのメインカラー
mainTextureメインテクスチャ
shader割り当てられたシェーダーの参照
renderQueueレンダリング順序の上書き
enableInstancingGPU インスタンシングの切り替え
SetColor(name, color)カラープロパティを変更します
SetFloat(name, value)float プロパティを設定します
SetTexture(name, texture)テクスチャを割り当てます
SetVector(name, vector)ベクトルプロパティを設定します
SetMatrix(name, matrix)行列プロパティを設定します
HasProperty(name)プロパティが存在するか確認します
EnableKeyword(keyword)シェーダーキーワードを有効にします
CopyPropertiesFromMaterial(mat)別のマテリアルからコピーします
Lerp(start, end, t)マテリアル間を補間します

重要: プロパティを変更する前に、使用するシェーダーを設定してください。現在のシェーダーがプロパティをサポートしていない場合、プロパティの割り当ては反映されません。

テクスチャ

テクスチャは、メッシュの表面に適用するビットマップ画像です。主な概念は次のとおりです。

  • 2 のべき乗の寸法が推奨されます:32、64、128、256、512、1024、2048、4096
  • LDR(低ダイナミックレンジ):PNG、JPG -- 値の範囲は 0.0~1.0 です
  • HDR(ハイダイナミックレンジ):EXR、HDR -- 拡張された色範囲に対応します
  • RGBA:RGB カラーに、透明度を表すアルファチャンネルを加えたものです
  • ピクセルあたりのビット数(bpp):値を低くするとメモリ使用量が減り、GPU キャッシュの効率が向上します
  • 異方性フィルタリング:急角度から見たときの品質を向上させます

参照:references/materials-textures.md 出典:Materials、Textures

カメラ

カメラはシーン内の特定の視点から画像を生成し、その出力を画面に表示したり、テクスチャとしてキャプチャしたりします。

投影モード:

  • パースペクティブ -- 人間の視覚を再現します。遠くにあるオブジェクトほど小さく見えます(デフォルト)
  • オルソグラフィック -- パースペクティブがありません。距離にかかわらずオブジェクトは一貫したサイズで描画されます。アイソメトリックゲームや 2D ゲームに便利です

主な詳細:

  • シーンごとに少なくとも 1 台のカメラが必要です
  • 複数のカメラに対応しており、描画順を設定できます
  • 描画パスは Player 設定で指定し、カメラごとに上書きできます
  • URP と HDRP には、パイプライン固有のカメラのドキュメントがあります
  • オルソグラフィックカメラでは、深度に基づくのではなく、フォグが均一に描画されます

一般的なカメラ設定:

  • パズルゲーム:全体を見渡せる固定カメラ
  • FPS:目の高さでプレイヤーに親子付けしたカメラ
  • レースゲーム:車両を追従するカメラ

出典:Cameras

ポストプロセッシング

ポストプロセッシングエフェクトは、物理カメラやフィルムの特性をシミュレートしたり、様式化されたビジュアルを実現したりします。

パイプラインポストプロセッシングソリューション
URP組み込み(URP テンプレートとともにインストール)
HDRP組み込み(HDRP テンプレートとともにインストール)
Built-inPost-Processing Version 2 パッケージ(別途)

警告: ポストプロセッシングソリューションは、レンダーパイプライン間で相互に置き換えることはできません。各パイプラインでは、エフェクトや実装方法が異なります。

HDRP のアンチエイリアシングオプション:

  • MSAA -- 最も多くのリソースを消費します
  • TAA -- モーションに応じた時間方向の平滑化です
  • SMAA -- パターンベースのエッジブレンディングです
  • FXAA -- ピクセル単位で処理され、最も負荷が低い方式です

HDRP の露出: ヒストグラムに基づき、パーセンタイル選択、測光モード、Physical Light Units での精度を高めるプリ露出に対応します。

出典:Post-Processing

Render Graph(Unity 6)

Render Graph システムは、カスタム SRP レンダーパスを高水準で表現し、各パスでリソースをどのように使用するかを明示します。URP と HDRP はどちらも Render Graph を使用します。

主な原則
  1. ハンドルベースのリソース -- 直接参照の代わりに TextureHandle、BufferHandle、RendererListHandle を使用します
  2. スコープ内でのアクセス -- 実際のリソースにアクセスできるのは、レンダーパスの実行コード内だけです
  3. 明示的な宣言 -- 各パスで読み取りと書き込みを宣言し、依存関係の追跡を可能にします
  4. 永続性なし -- ある実行内で作成されたリソースを、次の実行に持ち越すことはできません
  5. RTHandle への依存 -- テクスチャは RTHandle システムを使用します
3 段階の実行(フレームごと)
  1. セットアップ -- すべてのレンダーパスとリソースの依存関係を宣言します
  2. コンパイル -- システムが未使用のパスを除外し、効率的な割り当てのためにリソースの生存期間を計算します
  3. 実行 -- 除外されなかったパスを宣言順に実行します
主な API パターン -- AddRenderPass
using UnityEngine.Rendering;
using UnityEngine.Rendering.RenderGraphModule;

// 1. Define pass data
class MyPassData { public TextureHandle input, output; public float param; }

// 2. Create and configure pass
using (var builder = renderGraph.AddRenderPass<MyPassData>("MyPass", out var passData))
{
    passData.input = builder.ReadTexture(inputTexture);
    passData.output = builder.UseColorBuffer(
        renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
        { colorFormat = GraphicsFormat.R8G8B8A8_UNorm, name = "Output" }), 0);
    passData.param = 2.5f;

    builder.SetRenderFunc((MyPassData data, RenderGraphContext ctx) =>
    {
        var mpb = ctx.renderGraphPool.GetTempMaterialPropertyBlock();
        mpb.SetTexture("_MainTexture", data.input);
        mpb.SetFloat("_FloatParam", data.param);
        CoreUtils.DrawFullScreen(ctx.cmd, material, mpb);
    });
}

// 3. Lifecycle: new RenderGraph() -> BeginRecording() -> AddPasses -> EndRecordingAndExecute() -> Cleanup()
RenderGraphBuilder の主なメソッド
メソッド目的
ReadTexture / WriteTextureテクスチャの読み取り/書き込み依存関係を宣言します
UseColorBuffer / UseDepthBuffer書き込みを宣言し、レンダーターゲット/深度ターゲットとして自動バインドします
CreateTransientTextureパス内でスコープされる一時テクスチャを作成します
ReadComputeBuffer / WriteComputeBufferバッファーの読み取り/書き込みを宣言します
UseRendererListレンダラーリストの使用を宣言します
SetRenderFuncレンダリングコールバックを設定します
EnableAsyncCompute / AllowPassCullingパスの動作を制御します

リソースの作成: CreateTexture()、CreateComputeBuffer()、CreateRendererList() 外部リソースのインポート: ImportTexture()、ImportBackbuffer()、ImportBuffer()

参照:Render Graph

レンダリングの最適化

ドローコールのバッチ処理

バッチ処理では、同じマテリアルを使用するメッシュをまとめることで、Unity がレンダーステートを更新する回数を減らして描画します。

SRP Batcher(URP/HDRP のみ):

  • 呼び出し間のレンダーステートの変更を最小限に抑え、ドローコールにかかる CPU 時間を削減します
  • マテリアルデータは GPU メモリに保持されます
  • オブジェクトごとの専用 GPU 定数バッファーを使用します
  • 最適な結果を得るには、シェーダーバリアントの数をできるだけ少なくします
  • URP、HDRP、カスタム SRP と互換性があります。Built-in パイプラインには対応していません

静的バッチ処理:

  • 静止したメッシュを統合した頂点/インデックスバッファー(ワールド空間)に統合します
  • 各バッファーは最大 64,000 頂点に対応します
  • ビルド時または実行時に動作します
  • Mesh Renderer のみが対象です(Skinned Mesh Renderer は対象外)

動的バッチ処理:

  • 実行時に CPU 上で頂点をワールド空間に変換します
  • プロシージャル生成されたジオメトリ(パーティクル、線、軌跡)に便利です
  • メッシュは頂点属性 900 個、または頂点 300 個に制限されます
  • ほとんどの用途では推奨されません。CPU のオーバーヘッドがドローコール削減の効果を上回る可能性があります
  • HDRP ではサポートされていません

GPU インスタンシング:

  • 同じメッシュの複数のインスタンスを 1 回のドローコールで描画します
  • Material.enableInstancing で有効にします
  • HLSL マクロを使ってインスタンスごとのプロパティ(色、トランスフォーム)を追加します
  • インスタンシングマクロに対応したシェーダーが必要です
オクルージョンカリング

ほかのオブジェクトの背後に隠れている GameObject の描画を防ぎます。視錐台カリングと併用できます。

  • ベイク処理(エディター):シーンをセルに分割し、可視性データを生成します
  • 実行時:ベイク済みデータを読み込み、カメラごとに可視性をクエリします
  • 最適な用途:オーバードローが発生する GPU バウンドのプロジェクト、または堅固なジオメトリで区切られた小さなエリア
  • 制限事項:動的オブジェクトはオクルードされますが、ほかのオブジェクトをオクルードすることはできません
  • URP/HDRP:CPU ベースの方式の代わりに、GPU オクルージョンカリングを使用できます

参照:ドローコールのバッチ処理、SRP Batcher

よく使われるパターン(C#)

実行時のマテリアルプロパティへのアクセス
// Set shader before modifying properties
material.SetColor("_BaseColor", Color.red);
material.SetFloat("_Smoothness", 0.8f);
material.SetTexture("_BaseMap", myTexture);
if (material.HasProperty("_Metallic"))
    material.SetFloat("_Metallic", 1.0f);
material.EnableKeyword("_EMISSION");
インスタンスマテリアルと共有マテリアル
Renderer rend = GetComponent<Renderer>();
rend.material.color = Color.blue;        // SAFE: creates per-object instance
// rend.sharedMaterial.color = Color.blue; // DANGEROUS: modifies asset for ALL objects
MaterialPropertyBlock(マテリアルインスタンスを使わないオブジェクトごとのバリエーション)
// WARNING: MaterialPropertyBlock BREAKS SRP Batcher compatibility.
// Use only when SRP Batcher is not critical (e.g., Built-in pipeline, few unique objects).
// For SRP Batcher-compatible per-object variation, use GPU Instancing with instance properties
// or create material instances via renderer.material.
private static readonly int BaseColorID = Shader.PropertyToID("_BaseColor");
private MaterialPropertyBlock _propBlock = new MaterialPropertyBlock();

void SetColor(Color color)
{
    Renderer rend = GetComponent<Renderer>();
    rend.GetPropertyBlock(_propBlock);
    _propBlock.SetColor(BaseColorID, color);
    rend.SetPropertyBlock(_propBlock);
}

アンチパターン

アンチパターン問題解決策
実行時に renderer.sharedMaterial を変更するマテリアルアセットが変更され、それを使用するすべてのオブジェクトに影響しますrenderer.material(インスタンスを作成)または MaterialPropertyBlock を使用します
毎フレーム新しい Material インスタンスを作成するメモリリークが発生し、割り当てが際限なく増加しますマテリアルインスタンスをキャッシュします。オブジェクトごとのバリエーションには MaterialPropertyBlock を使用します
URP/HDRP で Surface Shader を使用するサポートされていないため、失敗するかピンク色で描画されますShader Graph を使用するか、HLSL シェーダーを記述します
レンダーパイプラインのアセットを混在させる異なるパイプラインのシェーダーやマテリアルはピンク色で描画されますパイプライン固有のシェーダーを使用し、切り替え時にマテリアルアップグレーダーを実行します
2 の累乗ではないテクスチャサイズを使用する圧縮に失敗し、メモリ使用量が増加します32、64、128、256、512、1024、2048、4096 を使用します
動的バッチングをデフォルトで有効にするCPU のオーバーヘッドがドローコール削減の効果を上回ることがよくありますSRP Batcher(URP/HDRP)または静的バッチングを優先します
シェーダーバリアントが多すぎるビルド時間、メモリ使用量、読み込み時間が増加します未使用のバリアントを除外し、キーワードの使用を最小限に抑えます
実行時に Shader.Find() を使用する処理が遅く、シェーダーがビルドに含まれていない場合は失敗することがありますシェーダー参照をキャッシュし、Inspector で割り当てます
m_RenderGraph.Cleanup() の呼び出しを忘れるGPU リソースリークが発生しますパイプラインの Dispose() で必ずクリーンアップします
透明オブジェクトのレンダーキューを無視するZ ファイティングやソート順の誤りが発生します適切な renderQueue を設定し、透明オブジェクトを奥から手前にソートします

主要 API のクイックリファレンス

クラス/構造体名前空間用途
MaterialUnityEngineレンダラーのシェーダープロパティを制御します
ShaderUnityEngineコンパイル済みシェーダープログラムを参照します
Texture2DUnityEngine2D テクスチャアセットです
RenderTextureUnityEngineGPU で描画するテクスチャターゲットです
CameraUnityEngineシーンの視点と描画を制御します
RendererUnityEngineすべてのレンダラーの基底クラスです
MaterialPropertyBlockUnityEngineインスタンスを作成せずに、オブジェクトごとのシェーダープロパティを設定します
CommandBufferUnityEngine.RenderingGPU コマンドリストです
RenderGraphUnityEngine.Rendering.RenderGraphModuleフレームの描画パスを管理します
TextureHandleUnityEngine.Rendering.RenderGraphModuleRender Graph のテクスチャ参照です
BufferHandleUnityEngine.Rendering.RenderGraphModuleRender Graph のバッファー参照です
RenderGraphBuilderUnityEngine.Rendering.RenderGraphModule個々の描画パスを設定します
CoreUtilsUnityEngine.Renderingユーティリティメソッド(DrawFullScreen など)を提供します
VolumeUnityEngine.Renderingポストプロセス/環境エフェクトのコンテナーです
VolumeProfileUnityEngine.RenderingVolume エフェクトのオーバーライドのコレクションです

関連スキル

  • unity-lighting-vfx -- ライティング設定、ライトの種類、ベイク、VFX Graph、パーティクルシステム
  • unity-platforms -- プラットフォーム固有のレンダリング設定、品質ティア、シェーダーの除外
  • unity-2d -- 2D Renderer(URP)、スプライト描画、タイルマップ描画

Additional Resources

コメント