유니티 엔진을 통해 3D 게임을 제작하던 와중에, Terrain으로 제작한 맵이 이상하게 빛이 나는 상황을 겪었다. 마치 금속 재질처럼 Specular reflection이 강하게 나타나는 상황이다.
해당 문제는 유니티 커뮤니티에서 제기된 것으로, 유니티 측에서는 실제 엔진의 버그가 맞다고 답변하였다.
Unity 2023 버전에서 해당 문제가 해결되었지만, 그 이하 버전인 2022, 2021 버전을 사용한다면 여전히 발생한다(2020은 있는지 알 수 없음).
문제 상황
일반적으로 Mesh를 배치하여 맵을 제작할 땐 각각에 Materials를 적용한다. 그래서 Specular 수치를 조절해서 빛의 반사가 어떻게 적용될지 조절한다.
그런데 Terrain을 기반으로 맵을 적용했더니 위 사진처럼 Terrain이 금속 재질처럼 반짝거리는 문제가 발생했다. 풀과 바위로 구성되어 반사가 거의 없어야 하는 맵인데 번쩍거리는 문제가 심각했다.
해당 문제는 Android로 대상 플랫폼을 변경하면서 발생했다. 그전에는 존재하지 않았던 문제다.
Material을 수정하려고 하니 Terrain에서는 Material로 Universal Rendering Pipeline/Terrain/Lit Shader를 사용했다. 근데 문제는 이게 2022.3.34f를 사용했더니 이상하게 material에 다양한 옵션을 조절할 수가 없게 되어버렸다.
즉, 이 specular reflection을 없앨 방법이 없었다.
환경
내가 위와 같은 문제가 발생한 환경은 이렇다.
- 엔진 버전: Unity 2022.3.34f
- 그래픽스 파이프라인: URP(Universal Rendering Pipeline)
- 개발 플랫폼: Windows 11
- 빌드 대상 플랫폼: Android
빌드할 플랫폼은 Android 뿐만 아니라 IOS로 설정해도 위 문제가 발생하는 것으로 알고 있다. 모바일 환경 자체의 문제로 보인다.
해결 방법
우선 해결 방법부터 알아보자.
유니티 커뮤니티의 토론에서 나온 글인데, 좋은 해결 방법이 제시되어 있어 달아본다.
Unity terrain looks like a shiny rock in URP mobile - Unity Engine - Unity Discussions
위 글에 따르면, 여러 가지 해결 방법이 있다.
텍스처 색상 형식 변경하기(추천 안함)
가장 간단한 방법으로, Terrain에 사용되는 텍스처의 색상 형식을 RGB 16 bit 혹은 RGB 24 bit로 변경하는 방법이 있다(24bit가 16bit보다 좀 더 고화질).
위는 Default를 변경하는데, Android나 iOS만 바꿔도 되긴 한다.
다만 이렇게 Format을 alpha 값을 없애는 식으로 바꿔버리면 ‘텍스처 압축 기능’을 사용할 수 없다. 즉, 모바일 환경에서는 메모리 압박이 엄청나게 커진다.
그래서 다음 방식을 추천한다.
텍스처 압축 방식을 ETC2로 변경하기(추천)
내가 문제를 해결했던 방법이다.
상단의 File > Build Settings > Player Settings > Other Settings > Texture Compression Format > ETC2로 설정하기
기본 옵션은 ASTC로 설정되어 있다. 나중에 후술하겠지만, Unity 2023 이전에서는 ASTC 설정에 결함이 있어 specular 값이 이상하게 나타난다. 이는 ASTC만 그런 것이니 대체안으로 압축 방법을 ETC2로 바꿔준다.
이렇게만 해도 대부분의 경우 해결된다.
첫 번째 방식과 달리 텍스처를 압축하여 모바일 환경에서 메모리 부담을 주지 않는다. 다만 실제로 메모리 부담이 적은지는 테스트해보지 않아 알 수 없다. ASTC보다 압축률은 낮은 것으로 보이고 유연성이 좀 낮다고 한다. 옛날 iOS에서는 지원하지 않는다고 하는데, A7 칩을 사용하는 버전(2013)부터는 iOS에서도 ETC/ETC2 압축도 지원하는 것으로 보인다.
Unity의 압축 포맷 간 차이점에 대해서는 다음 글을 참고하였으며, 궁금하신 분들은 읽어보는 것을 추천한다.
텍스처 압축 포맷 : ASTC와 ETC2 — 끄적끄적 코딩 공방 (tistory.com)
Unity - Manual: Recommended, default, and supported texture formats, by platform (unity3d.com)
이외에도
이외에도 다양한 해결 방법이 제시되어 있다. 여기 있는 내용을 테스트해보진 않았으므로 정확하게 궁금하다면 참고 문헌의 “Unity terrain looks like a shiny rock in URP mobile”(1, 2)과 “Glossy - Shiny terrain after updating V2020.3.26 to 2021.2.15”를 읽어보자.
여기서 아래 2, 3번 방법은 Package Manager에서 Terrain Tools 패키지를 설치해주어야 하니 참고할 것.
- ASTC 압축 방식을 그대로 사용하고, Terrain에 사용되는 모든 texture를 투명하게 해서 alpha 값을 0으로 만들기.
- 무지막지하게 큰 맵 싣기: 140MB 이상 크기의 쉐이더를 Scene에 싣으면 URP Lit이 아니라 URP Simple Lit을 Terrain에 사용한다. 그로 인해 문제를 해결할 수도 있다고 함.
- Terrain에서 모든 브러시에 대해 Material을 선택하고, AO 값을 0으로 조절하기
다만, 위 방법은 유니티 2023.3.34f 버전을 사용하는 우리 프로젝트에서는 사용할 수 없었다. 아예 Terrain Lit을 선택했을 때 하단과 같은 추가 정보가 보이지 않았다. 이는 다른 프로젝트에서는 괜찮을 수도 있으니 참고할 것.
왜 발생했는가?
해당 문제는 “Unity terrain looks like a shiny rock in URP mobile[3]”에서 자세히 설명하고 있는데, 이를 요약하면 이렇다.
- Unity Terrian은 모바일 환경에서는 smoothness 옵션이 무시되는 상황이다.
- URP 쉐이더를 읽어본 결과, smoothness 값을 texture의 Alpha 값에서 가져오는 것이 문제이다.
- 그래서 ASTC compression 방식을 사용하면 alpha 값을 smoothness로 가져오는데, 텍스처의 alpha 값이 대부분 1로 설정되어 있다 보니(최대값) smoothness 값을 최대로 설정한다. 결과적으로 Terrain이 번쩍번쩍 빛나게 된다.
- 실제로 Alpha 값이 없는 RGB 24 bit로 설정하면 Terrain이 정상적으로 보이게 된다.
- 오직 iOS와 Android에서만 발생하는 문제로 스탠드얼론(Standalone, PC 빌드)에서는 생기지 않는다.
그 이외에도 해당 글에서는 URP Terrain Shader 자체의 문제도 설명하고 있는데, terrain이 아무것도 하지 않더라도 4개 쉐이더를 호출해서 RAM에서 140mb나 차지하는 문제가 발생한다고 한다.
유니티 측 스태프가 해당 글을 발견해서 위 버그는 2023 버전에서는 해결이 되었다. 그러나 여전히 이전 버전에서 작업할 땐 여전히 발생하는 버그이니 해당 글을 참고해서 해결하시길 바란다.
참고 글
- [1] 그림 1. 출처: Annoying shiny terrain - Questions & Answers - Unity Discussions
- [2] 그림 4. 출처: Glossy - Shiny terrain after updating V2020.3.26 to 2021.2.15 - Unity Engine - Unity Discussions
- [3] 해결 방법 참고 글: Unity terrain looks like a shiny rock in URP mobile - Unity Engine - Unity Discussions
- 텍스처 압축 포맷에 관한 설명글: 텍스처 압축 포맷 : ASTC와 ETC2 — 끄적끄적 코딩 공방 (tistory.com)
- 텍스처 압축 포맷에 대한 Unity Manual: Unity - Manual: Recommended, default, and supported texture formats, by platform (unity3d.com)
'Unity3D > Tip' 카테고리의 다른 글
유니티 이벤트 시스템 최적화하기 - Graphic Raycaster 제거하기 (0) | 2021.08.10 |
---|---|
유니티 2D에서 Collider와 Rigidbody 최적화에 관하여 (3) | 2021.08.09 |
Unity VSCode에서 오류가 날 때: CS0246 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요. (4) | 2020.12.26 |
유니티 프로파일러(Profiler)를 이용해 성능 개선하기 (4) | 2020.10.04 |
VSCODE (Visual Studio Code) 자동 완성 기능이 안 될 때(2023.9.11 추가) (23) | 2020.08.12 |
댓글