このページでは、ユニバーサルレンダーパイプライン (URP) の旧バージョンから URP 13 (Unity 2022.1) にアップグレードする方法を説明します。
ビルトインレンダーパイプラインのプロジェクト用に作成したアセットを、URP と互換性のあるアセットに変換する方法については、レンダーパイプラインコンバータ のページを参照してください。
レンダーターゲットが 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();
CoreUtils.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 パッケージを使用している場合は、まずそのパッケージを使用するエフェクトを移行します。