렌더 그래프 시스템에서 텍스처를 만들려면 UniversalRenderer.CreateRenderGraphTexture API를 사용합니다.
URP(유니버설 렌더 파이프라인)가 렌더 그래프를 최적화할 때 최종 프레임이 텍스처를 사용하지 않으면 렌더 패스가 사용하는 메모리와 대역폭을 줄이기 위하여 텍스처를 생성하지 않을 수 있습니다. URP가 렌더 그래프를 최적화하는 자세한 방법은 렌더 그래프 시스템 소개를 참조하십시오.
여러 프레임 또는 여러 카메라에서 텍스처를 사용하는 자세한 방법(예: 프로젝트에서 임포트한 텍스처 에셋)은 렌더 그래프 시스템으로 텍스처 임포트를 참고하십시오.
텍스처를 생성하려면 ScriptableRenderPass 클래스의 RecordRenderGraph 메서드에서 다음 과정을 수행하십시오.
RenderTextureDescriptor 오브젝트를 만듭니다.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라는 예시를 참조하십시오.