본문 바로가기

유니티/기타

[RenderTexture] 유니티 렌더텍스처 기본

반응형

 렌더 텍스처는 런타임에 업데이트 되는 텍스처를 렌더링할 수 있는 텍스처입니다. 게임 내 TV 카메라 또는 미니 맵과 같은 많은 아이디어에 활용할 수 있습니다. 이번 글에서는 렌더 텍스처를 만드는 방법과 렌더 텍스처의 소스 카메라를 셋팅하는 방법을 다룹니다.

 

  렌더 텍스처는 새 레벨 로드, 시스템 화면 보호기, 전체 화면 전환 등 특정 이벤트에서 손실 될 수 있음을 명심하세요. 그런 일이 발생하면 기존의 렌더 텍스처는 'not yet created'상태가 되며 'IsCreated' 함수로 확인할 수 있습니다.

 

 다른 'native engine object' 유형과 마찬가지로 렌더 텍스처의 수명에 주의를 기울이고 릴리스(RenderTexture.Release' 기능과 함께 사용을 마치면 이를 해제하는 것이 중요합니다. 일반 관리 유형처럼 가비지 수집되지 않기 때문입니다. 또한 렌더 텍스처가 릴리즈되고 바로 지워지는 것은 아닙니다. 만약 지우고 싶다면 GL.clear로 직접 지워야합니다.

->관련내용

https://forum.unity.com/threads/what-are-all-the-native-engine-object-types-in-unity.917822/

 

 렌더 텍스처는 GPU에 데이터 표현만 있으며, '를 사용하여 콘텐츠를 CPU 메모리로 전송해야 합니다. 새로 생성된 렌더 텍스처의 초기 내용은 정의되지 않습니다. 일부 플랫폼/API 에서는 콘텐츠가 기본적으로 검은색으로 표시되지만 사용자는 이에 의존해서는 안됩니다.

 

 설정값

- 차원 : 2d, cube, 3d

- 크기: 2의 거듭제곱 값만 입력할 수 있다.

- 안티 앨리어싱

- Color Format: https://docs.unity3d.com/ScriptReference/RenderTextureFormat.html

- 밉 맵 활성화/비활성화

 

 

최적화 관련

- Release: 렌더 텍스처에서 사용하는 하드웨어 리소스 해제, 텍스처 자체는 파괴되지 않음 -> 호출시 메모리가 해제됨

- DiscardContents: RenderTexture의 내용이 사용되지 않을 것임을 GPU에게 알림

 

Color Format 추천

- 일부 포맷은 대상 플랫폼에서 지원되지 않을 수 있다

- HDR을 사용하는 경우 RenderTextureFormat.ARGB64

- 보통의 경우 default인 ARGB32을 사용

 

SRGB = sRGB 비선형 인코딩을 사용하는 부호 없는 정규화 형식. (알파 채널도 있는 경우 선형 무부호 정규화 값이 됩니다.)
UNORM = 부호 없는 정규화 형식. (출력은 0과 1 사이입니다)
SNORM = 부호 있는 정규화 형식. (출력은 -1과 1 사이입니다.)
UINT = 부호 없는 정수 형식입니다. (출력은 0과 2^(n-1) 사이입니다. 여기서 n은 채널의 비트 수입니다.)
SINT = 부호 있는 정수 형식입니다. (출력은 -2^(n-1)과 2^(n-1) 사이입니다.)
UFLOAT = 부호 없는 부동 소수점 형식입니다.
SFLOAT = 부호 있는 부동 소수점 형식.
PACKn = 형식이 n비트의 기본 형식으로 압축됩니다.

 

HDR 색상 지원을 위해서는 16비트 또는 32비트 SFLOAT형식을 추천한다.

 

각종 주의사항 및 팁

안티앨리어싱 사용시 텍스처 크기를 엄청나게 증가시킬 수 있다.

- RenderTextureToTexture2D: Texture2D는 압축 가능

- Shader Model 5.0 이상에서 random access 가능

 

정말 짧게 사용하는 임시 Render Texture의 경우 'GetTemporary'를 이용하자

- 작업이 완료되는 즉시 ReleaseTemporary를 사용하여 해제

- 내부적으로 유니티는 임시 Render Texture 풀을 유지한다

- 이러한 임시 렌더 첵스처는 몇 프레임 동안 사용되지 않을 경우 파괴된다.

- 일반적인 렌더텍스처는 비용이 많이 드는 복원 작업을 수행. 임시 렌더 텍스처는 이를 방지

 

DiscardContents() 사용을 생활화하자

- rt에 그리기 전에 이 함수를 항상 호출하는 것이 좋다

 

 

참고

https://docs.unity3d.com/ScriptReference/RenderTexture.html

https://gamedev.stackexchange.com/questions/71643/rendertexture-is-not-cleared-after-it-was-released/71644#71644

https://docs.unity3d.com/Manual/class-RenderTexture.html

https://fargesportfolio.com/unity-texture-texture2d-rendertexture/

 

https://cyangamedev.wordpress.com/2019/07/08/render-textures/

https://www.codetd.com/en/article/6478271

 

반응형

'유니티 > 기타' 카테고리의 다른 글

[Unity] 가비지 컬렉션, 베스트 프래틱스  (2) 2023.12.20