Version: Unity 6.0 (6000.0)
언어 : 한국어
URP의 렌더 패스에서 텍스처 사용
URP에서 렌더 패스 간 텍스처 전송

URP의 렌더 그래프 시스템에서 텍스처 생성

렌더 그래프 시스템에서 텍스처를 만들려면 UniversalRenderer.CreateRenderGraphTexture API를 사용합니다.

URP(유니버설 렌더 파이프라인)가 렌더 그래프를 최적화할 때 최종 프레임이 텍스처를 사용하지 않으면 렌더 패스가 사용하는 메모리와 대역폭을 줄이기 위하여 텍스처를 생성하지 않을 수 있습니다. URP가 렌더 그래프를 최적화하는 자세한 방법은 렌더 그래프 시스템 소개를 참조하십시오.

여러 프레임 또는 여러 카메라에서 텍스처를 사용하는 자세한 방법(예: 프로젝트에서 임포트한 텍스처 에셋)은 렌더 그래프 시스템으로 텍스처 임포트를 참고하십시오.

텍스처 생성

텍스처를 생성하려면 ScriptableRenderPass 클래스의 RecordRenderGraph 메서드에서 다음 과정을 수행하십시오.

  1. 필요한 텍스처 프로퍼티를 사용하여 RenderTextureDescriptor 오브젝트를 만듭니다.
  2. UniversalRenderer.CreateRenderGraphTexture 메서드를 사용하여 텍스처를 생성하고 텍스처 핸들을 반환합니다.

예를 들어 다음은 화면과 동일한 크기의 텍스처를 만듭니다.

RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);
TextureHandle textureHandle = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "My texture", false);

그런 다음 동일한 커스텀 렌더 패스에서 텍스처를 사용할 수 있습니다.

현재 카메라만 텍스처에 액세스할 수 있습니다. 다른 카메라나 커스텀 렌더링 코드와 같이 다른 곳에서 텍스처에 액세스하려면 대신 텍스처를 임포트하십시오.

렌더 그래프 시스템은 사용자가 CreateRenderGraphTexture로 생성한 텍스처의 수명을 관리하므로, 텍스처 작업이 끝나면 텍스처가 사용하는 메모리를 수동으로 해제할 필요가 없습니다.

예제

다음 스크립터블 렌더러 기능에는 텍스처를 생성하고 노란색으로 모두 채워 초기화합니다. 렌더 파이프라인에 렌더 패스를 추가하는 자세한 방법은 스크립터블 렌더러 기능을 사용하여 패스 주입을 참고하십시오.

프레임 디버거를 사용하여 렌더 패스가 추가하는 텍스처를 확인합니다.

using UnityEngine;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering;

public class CreateYellowTextureFeature : ScriptableRendererFeature
{
    CreateYellowTexture customPass;

    public override void Create()
    {
        customPass = new CreateYellowTexture();
        customPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
    }

    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        renderer.EnqueuePass(customPass);
    }

    class CreateYellowTexture : ScriptableRenderPass
    {
        class PassData
        {
            internal TextureHandle cameraColorTexture;
        }

        public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
        {
            using (var builder = renderGraph.AddRasterRenderPass<PassData>("Create yellow texture", out var passData))
            {
                // Create texture properties that match the screen size
                RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);

                // Create a temporary texture
                TextureHandle texture = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "My texture", false);

                // Set the texture as the render target
                builder.SetRenderAttachment(texture, 0, AccessFlags.Write);
    
                builder.AllowPassCulling(false);

                builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context));
            }
        }

        static void ExecutePass(PassData data, RasterGraphContext context)
        {          
            // Clear the render target to yellow
            context.cmd.ClearRenderTarget(true, true, Color.yellow);            
        }
    }

}

다른 예시가 필요하다면 URP(유니버설 렌더 파이프라인) 패키지 샘플OutputTexture라는 예시를 참조하십시오.

추가 리소스

URP의 렌더 패스에서 텍스처 사용
URP에서 렌더 패스 간 텍스처 전송
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961