이 페이지는 이전 버전의 유니버설 렌더 파이프라인(URP)에서 URP 17(Unity 6)으로 업그레이드하는 방법을 소개합니다.
빌트인 렌더 파이프라인 프로젝트용으로 제작된 에셋을 URP와 호환되는 에셋으로 전환하는 방법에 대한 자세한 내용은 렌더 파이프라인 컨버터 페이지를 참조하십시오.
URP 17에는 커스텀 렌더 패스를 작성하는 방식에 큰 변화를 주는 렌더 그래프 시스템이 도입되었습니다.
프로젝트에 커스텀 렌더 패스가 포함된 경우 렌더 그래프 API를 사용하여 패스를 다시 작성하십시오. 렌더 그래프에 대한 상세 내용은 렌더 그래프 시스템 섹션을 참조하십시오.
다음 페이지에는 렌더 그래프 API를 사용하는 렌더 패스가 있는 스크립터블 렌더러 기능의 전체 예시가 나와 있습니다.
참고: Unity는 더 이상 렌더 그래프 API를 사용하지 않는 렌더링 경로를 개발하거나 개선하지 않습니다.
렌더 그래프는 새로운 URP 프로젝트에서 기본적으로 활성화됩니다.
호환성을 위하여 Unity 6에는 렌더 그래프 시스템을 비활성화하고 이전 URP 버전의 렌더링 API를 사용할 수 있는 옵션이 포함되어 있습니다. 렌더 그래프를 비활성화하려면 다음 체크박스를 활성화하십시오.
렌더 그래프가 없는 URP 버전으로 생성한 기존 프로젝트를 열 경우, 해당 프로젝트는 Unity 6로 열리며 호환성 모드가 자동으로 활성화됩니다.
렌더 그래프 구현을 더욱 면밀하게 파악하려면 렌더 그래프 뷰어를 사용하십시오.
VolumeComponent.Override(VolumeComponent state, float interpFactor) 메서드를 오버라이드하는 커스텀 Volume 컴포넌트 클래스를 생성할 경우 VolumeParameter 값이 변경될 때마다 오버라이딩 구현부에서 VolumeParameter.overrideState 프로퍼티를 true로 설정해야 합니다. 이렇게 하면 볼륨 프레임워크가 파라미터를 올바른 기본값으로 초기화합니다. 이렇게 하면 프레임워크가 프레임마다 리소스를 더 적게 사용하므로 성능이 향상됩니다.
SHADER_QUALITY_LOW/MEDIUM/HIGH 및 SHADER_HINT_NICE_QUALITY 셰이더 정의가 제거되었습니다. 커스텀 셰이더에서 이러한 정의를 사용한 경우 SHADER_QUALITY_LOW/MEDIUM/HIGH 대신 SHADER_API_MOBILE 또는 SHADER_API_GLES 정의를 사용하는 것이 좋습니다.
이제 ScriptableRendererFeature 인스턴스가 렌더 타겟이 ScriptableRenderer 클래스에서 할당되기 전에 렌더 타겟에 액세스하려고 시도하면 Unity에서 오류가 발생합니다.
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과 같은 스케일링 인자를 사용하여 동적 스케일링을 지원합니다.
다음 예시는 새 API를 사용하기 위해 RenderTargetHandle 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 에디터에서 열면 Unity는 기존 포워드 렌더러 에셋을 유니버설 렌더러 에셋으로 업데이트합니다.
유니버설 렌더러 에셋에는 포워드 또는 디퍼드 렌더링 경로를 선택할 수 있는 Rendering Path 프로퍼티가 포함되어 있습니다.
이제 ClearFlag.Depth 메서드는 스텐실 버퍼를 암시적으로 지우지 않습니다. 새 메서드 ClearFlag.Stencil를 사용하십시오.
URP 12 이상은 렌더 파이프라인 컨버터 기능을 구현합니다. 이 기능은 이전에 Edit > Render Pipeline > Universal Render Pipeline > Upgrade…에서 제공되던 에셋 업그레이드 기능을 대체합니다.
다음 Shader Graph 셰이더의 파일 이름이 변경되었습니다. 새 파일 이름에는 공백이 없습니다.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메서드를 사용하여 입력을 선언한다고 예상합니다. 이 메서드는 URP가 임시 텍스처를 통한 렌더링이 필요한지 자동으로 결정하는 데 사용하는 정보를 제공합니다.
호환성 확보를 위해서 유니버설 렌더러에 Intermediate Texture라는 프로퍼티가 새로 추가되었습니다. 이 프로퍼티에서 Always를 선택하면 URP가 임시 텍스처를 사용합니다. Auto를 선택하면 새 동작이 활성화됩니다. Always 옵션은 렌더러 기능이 ScriptableRenderPass.ConfigureInput 메서드를 사용하여 입력을 선언하지 않는 경우에만 사용하십시오.
기존 프로젝트가 올바르게 동작하도록 하려면 렌더러 기능을 사용하던 모든 기존 유니버설 렌더러 에셋(URP에 포함된 에셋은 제외)의 Intermediate Texture 프로퍼티에서 Always 옵션을 선택해야 합니다. 새로 생성된 모든 유니버설 렌더러 에셋에는 Auto 옵션이 자동으로 선택되어 있습니다.
먼저 URP 7.2.0으로 업그레이드합니다. 유니버설 렌더 파이프라인 7.2.0 버전으로 업그레이드를 참조하십시오.
URP 8.x.x는 패키지 포스트 프로세싱 스택 v2를 지원하지 않습니다. 프로젝트가 패키지 포스트 프로세싱 스택 v2를 사용하는 경우 먼저 해당 패키지를 사용하는 효과를 마이그레이션하십시오.