unity-graphics について
Unity のグラフィックス開発者向けに、レンダーパイプライン、シェーダー、マテリアル、カメラ、最適化を扱うリファレンススキルです。Built-in、URP、HDRP の用途や制約も比較します。
主な機能
- 01Built-in、URP、HDRP の比較
- 02Shader Graph と HLSL のガイド
- 03マテリアル、テクスチャ、カメラの資料
- 04Render Graph とレンダリング最適化
活用シーン
- 01新規プロジェクトのパイプライン選定
- 02Unity シェーダーの作成やデバッグ
- 03ポストプロセスとカメラの設定
- 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.mdmaterials-textures.mdshader-graph.mdurp-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 Shaders | Shader Graph(推奨)、HLSL | Shader Graph(推奨)、HLSL |
| SRP Batcher | いいえ | はい | はい |
| レイトレーシング | いいえ | いいえ | はい(DXR) |
| ボリュメトリクス | いいえ | いいえ | はい(フォグ、雲) |
| アンチエイリアス | MSAA | FXAA、SMAA、TAA、MSAA | FXAA、SMAA、TAA、MSAA |
| プラットフォーム | すべて | すべて(スケーラブル) | ハイエンド(DX11/12、Metal、Vulkan) |
| GPU 要件 | 標準 | 標準 | コンピュートシェーダー対応 |
選択の流れ:
- レイトレーシング、ボリュメトリックな雲、または物理ベースの空が必要ですか? --> HDRP
- モバイル、WebGL、または最も幅広いプラットフォームを対象にする必要がありますか? --> URP
- 移行予算がなく、レガシープロジェクトを維持していますか? --> ビルトイン
- 新しいプロジェクトを始めますか? --> URP(ほとんどのプロジェクト)または HDRP(高忠実度)
警告: レンダーパイプラインは互換性がありません。あるパイプラインのマテリアル、シェーダー、ポストプロセスは、変換しない限り別のパイプラインでは動作しません。ビルトインのマテリアルを URP/HDRP にアップグレードするには、パイプラインのマテリアルアップグレーダーが必要です。シェーダーに互換性がないオブジェクトは、明るいピンク色で描画されます。
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 種類に分類しています:
- グラフィックスパイプラインシェーダー -- 最も一般的です。Shader オブジェクトと連携して、シーンの外観を決定します
- コンピュートシェーダー -- 通常のグラフィックスパイプラインの外で GPU 計算を実行します
- レイトレーシングシェーダー -- レイトレーシングの計算を処理します(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 ビット精度をサポートします
マテリアルとテクスチャ
マテリアルとシェーダーが連携して、シーンの外観を定義します。
マテリアル
主なワークフロー:
- マテリアルアセットを作成し、GameObject に割り当てます
- スクリプトを使って実行時にマテリアルのプロパティを変更します
- 大規模なマテリアルコレクションの管理には Material Variants を使用します
- ピンク色の描画を防ぐため、Built-in マテリアルを URP/HDRP にアップグレードします
Material API -- 主なプロパティとメソッド:
| プロパティ/メソッド | 用途 |
|---|---|
color | マテリアルのメインカラー |
mainTexture | メインテクスチャ |
shader | 割り当てられたシェーダーの参照 |
renderQueue | レンダリング順序の上書き |
enableInstancing | GPU インスタンシングの切り替え |
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-in | Post-Processing Version 2 パッケージ(別途) |
警告: ポストプロセッシングソリューションは、レンダーパイプライン間で相互に置き換えることはできません。各パイプラインでは、エフェクトや実装方法が異なります。
HDRP のアンチエイリアシングオプション:
- MSAA -- 最も多くのリソースを消費します
- TAA -- モーションに応じた時間方向の平滑化です
- SMAA -- パターンベースのエッジブレンディングです
- FXAA -- ピクセル単位で処理され、最も負荷が低い方式です
HDRP の露出: ヒストグラムに基づき、パーセンタイル選択、測光モード、Physical Light Units での精度を高めるプリ露出に対応します。
Render Graph(Unity 6)
Render Graph システムは、カスタム SRP レンダーパスを高水準で表現し、各パスでリソースをどのように使用するかを明示します。URP と HDRP はどちらも Render Graph を使用します。
主な原則
- ハンドルベースのリソース -- 直接参照の代わりに
TextureHandle、BufferHandle、RendererListHandleを使用します - スコープ内でのアクセス -- 実際のリソースにアクセスできるのは、レンダーパスの実行コード内だけです
- 明示的な宣言 -- 各パスで読み取りと書き込みを宣言し、依存関係の追跡を可能にします
- 永続性なし -- ある実行内で作成されたリソースを、次の実行に持ち越すことはできません
- RTHandle への依存 -- テクスチャは RTHandle システムを使用します
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 オクルージョンカリングを使用できます
よく使われるパターン(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 のクイックリファレンス
| クラス/構造体 | 名前空間 | 用途 |
|---|---|---|
Material | UnityEngine | レンダラーのシェーダープロパティを制御します |
Shader | UnityEngine | コンパイル済みシェーダープログラムを参照します |
Texture2D | UnityEngine | 2D テクスチャアセットです |
RenderTexture | UnityEngine | GPU で描画するテクスチャターゲットです |
Camera | UnityEngine | シーンの視点と描画を制御します |
Renderer | UnityEngine | すべてのレンダラーの基底クラスです |
MaterialPropertyBlock | UnityEngine | インスタンスを作成せずに、オブジェクトごとのシェーダープロパティを設定します |
CommandBuffer | UnityEngine.Rendering | GPU コマンドリストです |
RenderGraph | UnityEngine.Rendering.RenderGraphModule | フレームの描画パスを管理します |
TextureHandle | UnityEngine.Rendering.RenderGraphModule | Render Graph のテクスチャ参照です |
BufferHandle | UnityEngine.Rendering.RenderGraphModule | Render Graph のバッファー参照です |
RenderGraphBuilder | UnityEngine.Rendering.RenderGraphModule | 個々の描画パスを設定します |
CoreUtils | UnityEngine.Rendering | ユーティリティメソッド(DrawFullScreen など)を提供します |
Volume | UnityEngine.Rendering | ポストプロセス/環境エフェクトのコンテナーです |
VolumeProfile | UnityEngine.Rendering | Volume エフェクトのオーバーライドのコレクションです |
関連スキル
- unity-lighting-vfx -- ライティング設定、ライトの種類、ベイク、VFX Graph、パーティクルシステム
- unity-platforms -- プラットフォーム固有のレンダリング設定、品質ティア、シェーダーの除外
- unity-2d -- 2D Renderer(URP)、スプライト描画、タイルマップ描画