Version: Unity 6.0 (6000.0)
언어 : 한국어
URP의 스크립터블 렌더러 기능 API 레퍼런스
Restrict a render pass to a scene area in URP

URP에서 스크립팅을 통해 렌더 패스 삽입

Unity는 모든 프레임에서 각 활성 카메라를 렌더링하기 전에 beginCameraRendering 이벤트를 발생시킵니다. 카메라가 비활성 상태인 경우(예: 카메라 게임 오브젝트에 Camera 컴포넌트 체크박스가 선택 해제된 경우) Unity는 이 카메라에 대해 beginCameraRendering 이벤트를 발생시키지 않습니다.

이 이벤트에 대한 메서드를 구독하면 Unity가 카메라를 렌더링하기 전에 커스텀 로직을 실행할 수 있습니다. 커스텀 로직의 예로는 추가 카메라를 렌더 텍스처로 렌더링하고 해당 텍스처를 평면 반사 또는 감시 카메라 뷰 등의 효과에 사용하는 것을 들 수 있습니다.

RenderPipelineManager 클래스의 다른 이벤트는 URP 커스터마이즈를 위한 더 많은 방식을 제공합니다. 또한 이 문서에 설명된 원칙을 해당 이벤트에 사용할 수도 있습니다.

RenderPipelineManager API 사용

  1. RenderPipelineManager 클래스의 이벤트 중 하나에 메서드를 구독합니다.

  2. 구독된 메서드에서 ScriptableRenderer 인스턴스의 EnqueuePass 메서드를 사용하여 커스텀 렌더 패스를 URP 프레임 렌더링에 삽입합니다.

예제 코드:

public class EnqueuePass : MonoBehaviour
{
    [SerializeField] private BlurSettings settings;    
    private BlurRenderPass blurRenderPass;

    private void OnEnable()
    {
        ...
        blurRenderPass = new BlurRenderPass(settings);
        // Subscribe the OnBeginCamera method to the beginCameraRendering event.
        RenderPipelineManager.beginCameraRendering += OnBeginCamera;
    }

    private void OnDisable()
    {
        RenderPipelineManager.beginCameraRendering -= OnBeginCamera;
        blurRenderPass.Dispose();
        ...
    }

    private void OnBeginCamera(ScriptableRenderContext context, Camera cam)
    {
        ...
        // Use the EnqueuePass method to inject a custom render pass
        cam.GetUniversalAdditionalCameraData()
            .scriptableRenderer.EnqueuePass(blurRenderPass);
    }
}

예제

이 예제는 beginCameraRendering 이벤트에 메서드를 구독하는 방법을 설명합니다.

이 예제의 단계를 따라하려면 유니버설 프로젝트 템플릿을 사용해 새 Unity 프로젝트를 생성하십시오.

  1. 씬에서 큐브를 생성합니다. 이름을 Example Cube로 지정합니다.

  2. 프로젝트에서 C# 스크립트를 생성하고 URPCallbackExample로 명명합니다.

  3. 다음 코드를 복사하여 스크립트에 붙여 넣습니다. ```C# using UnityEngine; using UnityEngine.Rendering;

    public class URPCallbackExample : MonoBehaviour { // Unity calls this method automatically when it enables this component private void OnEnable() { // Add WriteLogMessage as a delegate of the RenderPipelineManager.beginCameraRendering event RenderPipelineManager.beginCameraRendering += WriteLogMessage; }

    // Unity calls this method automatically when it disables this component
    private void OnDisable()
    {
        // Remove WriteLogMessage as a delegate of the  RenderPipelineManager.beginCameraRendering event
        RenderPipelineManager.beginCameraRendering -= WriteLogMessage;
    }
    
    // When this method is a delegate of RenderPipeline.beginCameraRendering event, Unity calls this method every time it raises the beginCameraRendering event
    void WriteLogMessage(ScriptableRenderContext context, Camera camera)
    {
        // Write text to the console
        Debug.Log($"Beginning rendering the camera: {camera.name}");
    }
    

    } `` > **참고**: 이벤트를 구독할 때 핸들러 메서드(이 예제에서는WriteLogMessage)는 이벤트 델리게이트에 정의된 파라미터를 수락해야 합니다. 이 예제에서 이벤트 델리게이트는RenderPipeline.BeginCameraRendering이며, 이 델리게이트는 파라미터<ScriptableRenderContext, Camera>`를 요구합니다.

  4. URPCallbackExample 스크립트를 Example Cube에 연결합니다.

  5. Play를 선택합니다. Unity가 beginCameraRendering 이벤트를 발생시킬 때마다 콘솔 창에 스크립트의 메시지를 출력합니다.

    Unity가 콘솔에 로그 메시지를 출력합니다.
    Unity가 콘솔에 로그 메시지를 출력합니다.
  6. OnDisable() 메서드를 호출하려면 플레이 모드에서 Example Cube를 선택하고, 스크립트 컴포넌트 제목 옆의 체크박스를 선택 해제합니다. Unity가 RenderPipelineManager.beginCameraRendering 이벤트에서 WriteLogMessage의 구독을 해제하고 콘솔 창에 메시지 출력을 중지합니다.

    스크립트 컴포넌트를 비활성화합니다. 스크립트 컴포넌트 제목 옆의 체크박스를 선택 해제합니다.
    스크립트 컴포넌트를 비활성화합니다. 스크립트 컴포넌트 제목 옆의 체크박스를 선택 해제합니다.

MonoBehaviour에서 함수 사용

씬에 있는 어떤 게임 오브젝트를 통해서든 스크립터블 렌더 패스를 씬에 삽입할 수 있습니다. 이렇게 하면 렌더 패스가 활성화되는 시점을 더욱 정확하게 제어할 수 있습니다. 하지만 이는 렌더 패스를 사용하려는 모든 시점마다 GameObject가 렌더 패스를 주입해야 한다는 것을 의미합니다. 따라서 일반적인 효과는 스크립터블 렌더러 기능을 통해서 프로젝트에 삽입하는 것이 더 좋습니다.

게임 오브젝트를 통해 스크립터블 렌더 패스를 씬에 삽입하는 경우, URP가 해당 스크립트를 사용하는 방식을 고려해야 합니다. 해당 스크립터블 렌더 패스를 렌더링하는 첫 번째 카메라는 렌더 패스를 모두 사용하며, 렌더 패스가 적용되는 유일한 카메라입니다. 스크립터블 렌더 패스가 적용되며 첫 번째 카메라 이후에 렌더링하는 모든 카메라는 효과를 렌더링하지 않습니다.

예를 들어 두 개의 카메라가 있고 Update 메서드에 스크립터블 렌더 패스를 추가하는 경우, 렌더링할 첫 번째 카메라만 스크립터블 렌더 패스 효과를 사용합니다. 이는 첫 번째 카메라가 효과의 인스턴스를 모두 사용하기 때문입니다. 두 번째 카메라는 Update 메서드의 다음 호출 전에 렌더링되므로, 스크립터블 렌더 패스의 두 번째 인스턴스를 사용할 수 없습니다. 그 결과 두 번째 카메라는 스크립터블 렌더 패스의 효과를 출력에 적용하지 않습니다.

URP의 스크립터블 렌더러 기능 API 레퍼런스
Restrict a render pass to a scene area in URP
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961