WinCNT

URP에서 특정 카메라의 렌더링 후에 호출되는 함수 본문

Unity/Unity 관련

URP에서 특정 카메라의 렌더링 후에 호출되는 함수

WinCNT_SSS 2023. 4. 25. 11:19

서론

텍스처를 만들기 위해 게임 재생 중에 스크립트에서 카메라를 만들고, 그 카메라의 Output RenderTexture를 텍스처로 저장하는 업무를 하던 도중 알게 된 내용을 정리하고자 한다

[ExecuteInEditMode]로 게임 재생 중이 아니어도 가능하게 하고 싶었지만 복잡해져서 일단 타협했다


URP에서는 OnPreCull(), OnPreRender(), OnPostRender(), OnRenderImage()를 지원 안 함

처음 Bake버튼을 누르면 검정 텍스처가 출력되고, 두번째부터는 제대로 된 텍스처가 출력되는 이슈를 경험하고 나서야, 겨우 Bake버튼 호출 시와 카메라 렌더링의 순서에 대해 고민해야 한다는 것을 깨달았다

그래서 렌더링이 끝난 뒤에 텍스처를 출력하는 쪽으로 방향을 선회하려고 했다

 

그런데 문제는 현재의 URP 환경에서는 유니티의 생명 주기(Life Cycle)의 Rendering관련 이벤트들이 대부분 지원이 안 되고 있다는 점이었다!

Universal Render Pipeline(URP)乗り換えハマりポイントまとめ

 

Universal Render Pipeline(URP)乗り換えハマりポイントまとめ

バッジを贈って著者を応援しよう バッジを受け取った著者にはZennから現金やAmazonギフト券が還元されます。 バッジを贈る

zenn.dev

처음에는 이 사실을 모르고 사용해 봤으나 평범하게 호출이 안 되었다…


URP에서의 대안

그래도 다행히 대안은 존재했다

  • RenderPipelineManager.beginCameraRendering
  • RenderPipelineManager.endCameraRendering

Unity - Scripting API: Rendering.RenderPipelineManager.endCameraRendering

 

Unity - Scripting API: Rendering.RenderPipelineManager.endCameraRendering

When Unity calls RenderPipeline.EndCameraRendering, it executes the methods in this delegate's invocation list. In the Universal Render Pipeline (URP) and the High Definition Render Pipeline (HDRP), Unity calls RenderPipeline.EndCameraRendering automatical

docs.unity3d.com

갑자기 잘 모르는 개념인 delegate에 대해서 나오긴 했지만, 대충 C++의 함수 포인터나 std::function과 비슷한 거라고 퉁(?)치고 넘어갔다

(나중에 자세히 알아보자)

 

아무튼 예제를 참고하여 다음과 같이 코드를 작성해서 테스트 해보니 잘 작동했다

void Start()
{
    RenderPipelineManager.endCameraRendering += OnEndCameraRendering;
}

void OnEndCameraRendering(ScriptableRenderContext context, Camera camera)
{
    if (!isClickedBakeButton)
    {
        return;
    }
		// Bake버튼이 눌리고 특정 카메라의 렌더링이 끝나면 텍스처 저장 작업을 함
    else if (cameraForBake.Equals(camera))
    {
        SaveBakeResultToTexture();
        isClickedBakeButton = false;
    }
}

void OnDestroy()
{
    RenderPipelineManager.endCameraRendering -= OnEndCameraRendering;
}

결과

위의 소스 코드를 사용해서, Bake버튼을 눌르면, 원점에 새로운 카메라를 생성하고 그 카메라의 렌더링 결과를

png파일로 저장하는 처리하는 스크립트를 만들었다

 

다음은 그 결과 이미지이다

 

씬과 메인 카메라의 뷰

Bake버튼 클릭 결과(새로 생긴 원점의 카메라의 렌더링 결과를 출력)


마무리

다행히도 난관 하나를 넘을 수 있었다

하지만 아직도 갈 길이 멀었으니 계속해서 정리해 나가고자 한다


참고 사이트

Universal Render Pipeline(URP)乗り換えハマりポイントまとめ

 

Universal Render Pipeline(URP)乗り換えハマりポイントまとめ

バッジを贈って著者を応援しよう バッジを受け取った著者にはZennから現金やAmazonギフト券が還元されます。 バッジを贈る

zenn.dev

Unity - Scripting API: Rendering.RenderPipelineManager.endCameraRendering

 

Unity - Scripting API: Rendering.RenderPipelineManager.endCameraRendering

When Unity calls RenderPipeline.EndCameraRendering, it executes the methods in this delegate's invocation list. In the Universal Render Pipeline (URP) and the High Definition Render Pipeline (HDRP), Unity calls RenderPipeline.EndCameraRendering automatical

docs.unity3d.com