URP의 CustomRenderFeature와 RenderPass를 파악하기 쉽게 필요한 코드만 이용해 만든 프로젝트입니다.

 

https://github.com/CatDarkGame/CustomRenderFeatureExample/releases/tag/SimpleRenderFeature

 

Release SimpleRenderFeature · CatDarkGame/CustomRenderFeatureExample

 

github.com

 

 

 

핵심 코드

 

1. 임시렌더텍스처 생성

// 임시렌더텍스처 생성
CameraData cameraData = renderingData.cameraData;
RenderTextureDescriptor descriptor = new RenderTextureDescriptor(cameraData.camera.scaledPixelWidth, cameraData.camera.scaledPixelHeight);
cmd.GetTemporaryRT(PROPERTY_TEMPBUFFER, descriptor, FilterMode.Bilinear);

RenderPass 내부에서 화면 데이터를 가져와 쉐이더 효과를 입히기 위해서 임시렌더텍스처 생성이 필요합니다.

RenderTextureDescriptor는 렌더텍스처 생성에 필요한 변수들이 있는 구조체입니다.

 

RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor;

위 예시처럼 새로 메모리를 만들지 않고 cameraData에서 직접 참조 가능하지만

 

좌측 예시처럼 임시 렌더텍스처에도 MSAA가 적용되는 이슈가 발생합니다.

새로 메모리를 생성해서 진행하면 우측처럼 정상적으로 한번만 MSAA가 적용됩니다.

 

 

 

2. Blit

// 현재 화면 데이터를 Material 효과를 적용하며 임시렌더텍스처에 복사
cmd.Blit(_destination, _tempBuffer, _material);

// 임시렌더텍스처를 화면렌더텍스처에 복사
cmd.Blit(_tempBuffer, _destination);

다음 실제 렌더링하는 부분입니다.

Blit함수는 렌더텍스처를 복사하는 함수로, 인자값에 Material을 넣으면 쉐이더 효과를 입히며 복사합니다.

 

특이한점은 임시렌더텍스처에 먼저 렌더링하고, 화면 렌더텍스처 2번 렌더링하는 과정을 거칩니다.

이렇게 하지 않으면 화면이 반짝이는 이슈가 발생하는데 이유는 모르겠습니다.

 

 

3. 버퍼 실행 & 해제

public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
   ...
    context.ExecuteCommandBuffer(cmd);
    CommandBufferPool.Release(cmd);
}

public override void FrameCleanup(CommandBuffer cmd)
{
    cmd.ReleaseTemporaryRT(PROPERTY_TEMPBUFFER);
}

마지막으로 커맨드버퍼를 실행(렌더 호출)하고 메모리 해제를 합니다.

 

 

 

 

 


WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,