このページでは、ユニバーサルレンダーパイプライン (URP) の旧バージョンから URP 17 (Unity 6) にアップグレードする方法を説明します。
ビルトインレンダーパイプラインのプロジェクト用に作成したアセットを、URP と互換性のあるアセットに変換する方法については、レンダーパイプラインコンバータ のページを参照してください。
URP 17 では、レンダーグラフ システムが導入されました。この一環として、カスタムレンダーパスの記述方法が大幅に変更されました。
プロジェクトにカスタムレンダーパスが含まれている場合は、レンダーグラフ API を使用してパスを書き直してください。レンダーグラフの詳細については、レンダーグラフシステム セクションを参照してください。
以下のページでは、レンダーグラフ API を使用するレンダーパスを使用したスクリプタブルレンダラー機能の完全な例を紹介します。
ノート:Unity は、今後は、レンダーグラフ API を使用しないレンダリングパスの開発や改善を行うことはありません。
レンダーグラフは、新しい URP プロジェクトではデフォルトで有効になります。
互換性のために、Unity 6 にはレンダーグラフシステムを無効にして以前の URP バージョンのレンダリング API を使用するオプションがあります。レンダーグラフを無効にするには、以下のチェックボックスを有効にします。
レンダーグラフを使用しない URP バージョンで作成された既存のプロジェクトを開くと、Unity 6 でプロジェクトを開いた後、Unity が自動的に互換性モードを有効にします。
レンダーグラフの実装をよりよく理解するには、レンダーグラフビューアー を使用してください。
VolumeComponent.Override(VolumeComponent state, float interpFactor) メソッドをオーバーライドするカスタム Volume コンポーネントクラスを作成する場合、実装では、VolumeParameter 値が変更されるたびに VolumeParameter.overrideState プロパティを true に設定する必要があります。これにより、Volume フレームワークがパラメーターを正しいデフォルト値にリセットします。これにより、フレームごとに使用するリソースが削減され、パフォーマンスが向上します。
SHADER_QUALITY_LOW/MEDIUM/HIGH および SHADER_HINT_NICE_QUALITY シェーダー定義が削除されました。カスタムシェーダーでこれらの定義を使用していた場合は、SHADER_API_MOBILE または SHADER_API_GLES 定義を使用して SHADER_QUALITY_LOW/MEDIUM/HIGH を置き換えることを検討してください。
レンダーターゲットが ScriptableRenderer クラスによって割り当てられる前に、ScriptableRendererFeature のインスタンスがアクセスしようとすると、エラーが表示されるようになりました。
ScriptableRendererFeature クラスには新しい仮想関数 SetupRenderPasses があります。これは、レンダーターゲットが割り当てられ、使用する準備ができたときに呼び出されます。
コードで AddRenderPasses メソッドオーバーライド内の ScriptableRenderer.cameraColorTarget または ScriptableRenderer.cameraDepthTarget プロパティを使用している場合は、その実装を ScriptableRendererFeature.SetupRenderPasses メソッドに移動する必要があります。
ScriptableRenderer.EnqueuePass メソッドの呼び出しは、引き続き AddRenderPasses メソッド内で発生します。
以下の例は、新しい API を使用するようにコードを変更する方法を示しています。
古い API でのコード:
public override void AddRenderPasses(ScriptableRenderer renderer,
ref RenderingData renderingData)
{
// The target is used before allocation
m_CustomPass.Setup(renderer.cameraColorTarget);
// Letting the renderer know which passes are used before allocation
renderer.EnqueuePass(m_ScriptablePass);
}
新しい API でのコード:
public override void AddRenderPasses(ScriptableRenderer renderer,
ref RenderingData renderingData)
{
// Letting the renderer know which passes are used before allocation
renderer.EnqueuePass(m_ScriptablePass);
}
public override void SetupRenderPasses(ScriptableRenderer renderer,
in RenderingData renderingData)
{
// The target is used after allocation
m_CustomPass.Setup(renderer.cameraColorTarget);
}
ユニバーサルレンダラーが、内部ターゲットと内部パスに RTHandle システム を使用するようになりました。
RenderTargetHandle 構造体の使用はすべて非推奨として設定され、この構造体は将来削除されます。
パブリックインターフェース ScriptableRenderer.cameraColorTarget と ScriptableRenderer.cameraDepthTarget は非推奨としてマークされます。それぞれ ScriptableRenderer.cameraColorTargetHandle と ScriptableRenderer.cameraDepthTargetHandle に置き換えてください。
RTHandle ターゲットは CommandBuffer.GetTemporaryRT メソッドを使用せず、RenderTargetIdentifier 構造体よりも多くのフレームにわたって保持されます。プロパティ GraphicsFormat と DepthBufferBits を 0 以外の値に設定して RTHandle ターゲットを割り当てることはできません。cameraDepthTarget プロパティは、cameraColorTarget プロパティから分離する必要があります。
以下のヘルパー関数を使用すると、以前の GetTemporaryRT メソッドと同様の方法で、RTHandle システムで一時レンダーターゲットを作成および使用できます。
RenderingUtils.ReAllocateIfNeeded
ShadowUtils.ShadowRTReAllocateIfNeeded
アプリケーションの生存期間内にレンダーターゲットを変更しない場合は、RTHandles.Alloc メソッドを使用して RTHandle ターゲットを割り当てます。このメソッドは、コードが各フレームでレンダーターゲットを割り当てる必要があるかどうかを確認する必要がないため効率的です。
レンダーターゲットが全画面テクスチャの場合、つまりその解像度が画面の解像度と同じか、またはその分数倍である場合は、Vector2D.one などのスケーリング係数を使用して動的スケーリングをサポートします。
以下の例は、RenderTargetHandle API を使用しているコードを新しい API を使用するように変更する方法を示しています。
古い API でのコード:
public class CustomPass : ScriptableRenderPass
{
RenderTargetHandle m_Handle;
// With the old API, RenderTargetIdentifier might combine color and depth
RenderTargetIdentifier m_Destination;
public CustomPass()
{
m_Handle.Init("_CustomPassHandle");
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
var desc = renderingData.cameraData.cameraTargetDescriptor;
cmd.GetTemporaryRT(m_Handle.id, desc, FilterMode.Point);
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
cmd.ReleaseTemporaryRT(m_Handle.id);
}
public void Setup(RenderTargetIdentifier destination)
{
m_Destination = destination;
}
public override void Execute(ScriptableRenderContext context,
ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get();
// Set the same target for color and depth
ScriptableRenderer.SetRenderTarget(cmd, m_Destination, m_Destination, clearFlag,
clearColor);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
新しい API でのコード:
public class CustomPass : ScriptableRenderPass
{
RTHandle m_Handle;
// Then using RTHandles, the color and the depth properties must be separate
RTHandle m_DestinationColor;
RTHandle m_DestinationDepth;
void Dispose()
{
m_Handle?.Release();
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
var desc = renderingData.cameraData.cameraTargetDescriptor;
// Then using RTHandles, the color and the depth properties must be separate
desc.depthBufferBits = 0;
RenderingUtils.ReAllocateIfNeeded(ref m_Handle, desc, FilterMode.Point,
TextureWrapMode.Clamp, name: "_CustomPassHandle");
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
m_DestinationColor = null;
m_DestinationDepth = null;
}
public void Setup(RTHandle destinationColor, RTHandle destinationDepth)
{
m_DestinationColor = destinationColor;
m_DestinationDepth = destinationDepth;
}
public override void Execute(ScriptableRenderContext context,
ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get();
ScriptableRenderer.SetRenderTarget(cmd, m_DestinationColor, m_DestinationDepth,
clearFlag, clearColor);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
フォワードレンダラーアセットの名称が、ユニバーサルレンダラーアセットに変わりました。URP 12 が含まれている Unity エディターで既存のプロジェクトを開くと、フォワードレンダラーアセットがユニバーサルレンダラーアセットに更新されます。
ユニバーサルレンダラーアセットに含まれている Rendering Path プロパティで、フォワードレンダリングパスまたはディファードレンダリングパスを選択できます。
ClearFlag.Depth メソッドでステンシルバッファが暗示的に消去されることはなくなりました。新しいメソッド ClearFlag.Stencil を使用してください。
URP 12 以降には レンダーパイプラインコンバータ 機能が実装されています。これは、これまで Edit > Render Pipeline > Universal Render Pipeline > Upgrade… から使用できたアセットアップグレード機能に替わる機能です。
新しいファイル名にはスペースが含まれません。新しいファイル名にはスペースが含まれません。Autodesk InteractiveAutodesk Interactive MaskedAutodesk Interactive Transparent
コードで Shader.Find() メソッドを使用してシェーダーを検索する場合は、Shader.Find("AutodeskInteractive) のように、シェーダー名からスペースを削除してください。
バージョン 10.0.x 以降では、URP が _CameraNormalsTexture という法線テクスチャを生成できます。カスタムシェーダーでこのテクスチャにレンダリングするには、DepthNormals というパスを加えます。例については、Lit.shader での実装を参照してください。
URP 10.0.x には、スクリーンスペースアンビエントオクルージョン (SSAO) エフェクトが実装されています。
カスタムシェーダーで SSAO エフェクトを使用する場合は、SSAO に関連する以下のエンティティを考慮してください。
_SCREEN_SPACE_OCCLUSION キーワード。
Input.hlsl には、InputData 構造体に新しい宣言 float2 normalizedScreenSpaceUV が含まれています。
Lighting.hlsl には AmbientOcclusionFactor 構造体と間接的および直接的なオクルージョンを計算するための変数が含まれています。
struct AmbientOcclusionFactor
{
half indirectAmbientOcclusion;
half directAmbientOcclusion;
};
Lighting.hlsl には、SSAO テクスチャをサンプリングするための以下の関数が含まれています。
half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV)
Lighting.hlsl には、以下の関数が含まれています。
AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2
normalizedScreenSpaceUV)
カスタムシェーダーで SSAO をサポートするには、DepthNormals パスと _SCREEN_SPACE_OCCLUSION キーワードをシェーダーに追加します。例えば、Lit.shader をオンにします。
カスタムシェーダーがカスタムライティング関数を実装する場合は、GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV) 関数を使用してライティング計算の AmbientOcclusionFactor 値を取得します。
11.0.x では、影の法線バイアスを適用する式が、より適切にパンクチュアルライトと機能するよう若干修正されました。そのため、シーンによっては、以前のリビジョンの影のアウトラインと正確に一致させるために、このパラメーターの調整が必要になることがあります。通常は、ディレクショナルライトで 1.0 の代わりに 1.4 を使用すれば十分です。
以前のバージョンの URP では、レンダラーにアクティブなレンダラー機能がある場合に、URP は中間レンダラーを使用してレンダリングしていました。これは、一部のプラットフォームではパフォーマンスに大きな影響を与えます。このリリースでは、URP はこの問題を以下の方法で緩和します。URP は、レンダラー機能が ScriptableRenderPass.ConfigureInput メソッドを使用して入力を宣言することを想定しています。このメソッドは、中間テクスチャを使用したレンダリングが必要かどうかを自動的に判断するための情報を提供します。
ユニバーサルレンダラーには、互換性のための新しいプロパティ Intermediate Texture があります。このプロパティで Always を選択すると、URP は中間テクスチャを使用します。Auto を選択すると、新しい動作が有効になります。レンダラー機能が ScriptableRenderPass.ConfigureInput メソッドを使用して入力を宣言しない場合にのみ、Always オプションを使用するようにしてください。
既存のプロジェクトが正常に機能するように、レンダラー機能 (URP に含まれているものを除く) を使用していたすべての既存のユニバーサルレンダラーアセットでは、Intermediate Texture プロパティで Always オプションが選択されています。新しく作成されたユニバーサルレンダラーアセットでは、Auto オプションが選択されます。
まず、URP 7.2.0 にアップグレードします。ユニバーサルレンダーパイプラインのバージョン 7.2.0 にアップグレードする を参照してください。
URP 8.x.x は Post-Processing Stack v2 パッケージをサポートしていません。プロジェクトで Post-Processing Stack v2 パッケージを使用している場合は、まずそのパッケージを使用するエフェクトを移行します。