일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OculusMotionVectorPass
- 게임 수학
- Private Bytes
- Three(Two) Tone Shading
- Toon Shader
- URP
- ASW(Application SpaceWarp)
- C언어
- working set
- Rim Light
- ColorGradingLutPass
- 프로그래밍 기초
- Virtual Byte
- 가상 바이트
- Cartoon Rendering
- Windows Build
- 3d
- 벡터
- VR
- AppSW
- 개인 바이트
- Cell Shader
- 메모리 누수
- Cell Look
- URP로 변경
- 작업 집합
- Specular
- Today
- Total
WinCNT
URP에서 특정 카메라의 렌더링 후에 호출되는 함수 본문
서론
텍스처를 만들기 위해 게임 재생 중에 스크립트에서 카메라를 만들고, 그 카메라의 Output RenderTexture를 텍스처로 저장하는 업무를 하던 도중 알게 된 내용을 정리하고자 한다
[ExecuteInEditMode]로 게임 재생 중이 아니어도 가능하게 하고 싶었지만 복잡해져서 일단 타협했다
URP에서는 OnPreCull(), OnPreRender(), OnPostRender(), OnRenderImage()를 지원 안 함
처음 Bake버튼을 누르면 검정 텍스처가 출력되고, 두번째부터는 제대로 된 텍스처가 출력되는 이슈를 경험하고 나서야, 겨우 Bake버튼 호출 시와 카메라 렌더링의 순서에 대해 고민해야 한다는 것을 깨달았다
그래서 렌더링이 끝난 뒤에 텍스처를 출력하는 쪽으로 방향을 선회하려고 했다
그런데 문제는 현재의 URP 환경에서는 유니티의 생명 주기(Life Cycle)의 Rendering관련 이벤트들이 대부분 지원이 안 되고 있다는 점이었다!
Universal Render Pipeline(URP)乗り換えハマりポイントまとめ
처음에는 이 사실을 모르고 사용해 봤으나 평범하게 호출이 안 되었다…
URP에서의 대안
그래도 다행히 대안은 존재했다
- RenderPipelineManager.beginCameraRendering
- RenderPipelineManager.endCameraRendering
Unity - Scripting API: Rendering.RenderPipelineManager.endCameraRendering
갑자기 잘 모르는 개념인 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)乗り換えハマりポイントまとめ
Unity - Scripting API: Rendering.RenderPipelineManager.endCameraRendering
'Unity > Unity 관련' 카테고리의 다른 글
유니티 스크립트 게임 오브젝트의 레이어와 카메라의 컬링 마스크를 설정하기 (0) | 2023.05.19 |
---|---|
유니티 에디터 모드에서 다이얼로그(Dialogue)창 띄우기 (0) | 2023.04.26 |
Texture를 PNG파일로 저장하기 (0) | 2023.03.23 |
스크립트로 정점(버텍스) 컬러 변경하기 (0) | 2023.03.17 |
Unity의 인스펙터에 버튼 표시하기 (0) | 2023.02.17 |