디지털 프로젝트의 메모리 사용량에 있어 큰 부분을 차지하는 것 중 하나는 사용되는 텍스처의 크기와 양입니다. 다행히 언리얼 엔진에는 모든 프로젝트에 걸쳐 사용되는 텍스처 크기를 손실 없이 줄일 수 있는 매우 탄탄한 시스템이 있습니다. 아래에서는 이 시스템을 살펴보고 이를 통해 프로젝트에 필요한 텍스처 메모리를 줄이는 법을 알아보겠습니다.
언리얼 엔진은 최소 1x1에서 .ini 파일을 약간 수정하면 텍스처 해상도를 최대 8192x8192까지 지원합니다. 현재 DirectX 비디오 어댑터와 게임 콘솔은 1x1에서 2048x2048, 최대 8192x8192까지 다양한 텍스처 해상도를 지원하고 있습니다. 특정 하드웨어 장치가 지원하는 최고 텍스처 해상도는 제조 업체, 모델, 가용 텍스처 메모리에 따라 다릅니다. 언리얼 엔진 4에는 월드 지오메트리나 유저 인터페이스와 같은 다양한 영역에 렌더링되는 텍스처 해상도 관리용 기능 및 설정이 다수 있습니다.
언리얼 엔진 4는 기본적으로 텍스처 밉의 최대 수를 14로 제한합니다. 따라서 렌더링 가능한 최대 텍스처의 크기는 사실상 8192으로 제한됩니다(1x1에서 8192x8192까지가 14밉입니다).
여기에는 8192 텍스처를 임포트해도 4096의 mip1까지만 렌더링된다는 부작용이 있습니다. 엔진의 소스 파일에서 13으로 기본 설정된 상수 값 MAX_TEXTURE_MIP_COUNT는 8192텍스처 렌더링을 지원할 수 있도록 14로 변경 가능합니다. 이 상수는 다음의 소스 파일에 정의되어 있습니다(QAMar09 기준으로, 다른 QA 버전의 경우 확인이 필요합니다).
Src\\D3D10Drv\\Src\\D3D10Device.cpp
Src\\Engine\\Inc\\RHI.h
Src\\Engine\\Inc\\UnTex.h
Src\\Engine\\Src\\RHI.cpp
Src\\Engine\\Src\\TextureCube.cpp
UE 4.8 이후 프로젝트의 BaseDeviceProfiles.ini 파일에 다음 텍스트를 추가하고 MaxLODsize를 8192로 설정해 주면 C++ 코드 변경 없이도 8192까지의 텍스처를 사용할 수 있습니다.
[/Script/Engine.TextureLODSettings]
TextureLODGroup_World=(MinLODSize=1,MaxLODSize=8192,LODBias=0,MinMagFilter=aniso,MipFilter=point)
크기를 늘리고자 하는 섹션을 추가한 뒤 파일을 저장하고 에디터를 재시작합니다. 에디터 재시작 시 8192 크기로 임포트된 텍스처는 이제 LOD 1 크기가 4096으로 제한되지 않고 8192로 표시됩니다. 다음 예제 이미지에서는 크기가 최대 8192인 텍스처를 사용할 수 있도록 프로젝트의 BaseDeviceProfiles.ini 파일을 수정했습니다. 텍스처 Texture_8k_Test가 로드되면 텍스처의 임포트된 크기와 표시되는 크기가 모두 8192임을 볼 수 있습니다.

DXT는 픽셀들을 팔레트 색상 및 보간 색상을 가진 4x4 블록으로 묶는 것을 기반으로 하는 손실 압축을 사용합니다. 그 결과 8:1 DXT1 및 4:1 DXT5는 불변 압축 파일 크기가 됩니다. 비디오 메모리 및 텍스처 풀의 리소스는 특정 플랫폼이나 하드웨어에 대해 고정되어 있기 때문에 텍스처의 해상도와 리소스의 사용 사이에 균형이 이루어져야 합니다. 아래의 표는 완전한 밉(1x1에서 완전 네이티브 밉0까지)을 가진 여러 일반적인 해상도에서의 DXT1과 DXT5에 대한 메모리 요구량을 나타낸 것입니다. 메모리 요구량은 텍스처 해상도 비율의 상수에 가까운 배수이며, DXT5의 메모리 요구량은 DXT1의 두 배에 가깝습니다.
압축 비율에 대한 해상도는 상수이므로, 이 표에 기재되지 않은 텍스처의 해상도에 대한 메모리 요구량을 계산하려면 해상 비율을 곱하기만 하면 됩니다. 예를 들면, 1024x512 텍스처의 메모리 요구량은 1024x1024 텍스처 메모리 요구량의 절반이 됩니다.
이 표의 데이터는 Box-Filter 밉 생성과 DirectX 텍스처 압축을 사용하여 ATI의 Compressonator로 만든 텍스처로부터 컴파일 되었습니다.
| 해상도 | 1x1부터 총 밉의 수 | DXT1 | DXT5 |
|---|---|---|---|
| 16x16 | 5밉 | 312 bytes | 496 bytes |
| 32x32 | 6밉 | 824 bytes | 1.48kb (1,520 bytes) |
| 64x64 | 7밉 | 2.80kb (2,872 bytes) | 5.48kb (5,616 bytes) |
| 128x128 | 8밉 | 10.8kb (11,064 bytes) | 21.4kb (22,000 bytes) |
| 256x256 | 9밉 | 42.8kb (43,832 bytes) | 85.4kb (87,536 bytes) |
| 512x512 | 10밉 | 170kb (174,904 bytes) | 341kb (349,680 bytes) |
| 1024x1024 | 11밉 | 682kb (699,192 bytes) | 1.33MB (1,398,256 bytes) |
| 2048x2048 | 12밉 | 2.66MB (2,796,344 bytes) | 5.33MB (5,592,560 bytes) |
| 4096x4096 | 13밉 | 10.6MB (11,184,952 bytes) | 21.3MB (22,369,776 bytes) |
| 8192x8192 | 14밉 | 42.6MB (44,739,384 bytes) | 85.3MB (89,478,640 bytes) |
특정 게임 TextureGroups에 지원되는 최소 및 최대 LOD(밉)는 엔진의 환경설정 파일에 정의되어 있습니다.
환경설정 세팅 파일의 소스 세트는 [언리얼 엔진 4 설치 위치]\\Engine\\Config\\BaseDeviceProfiles.ini 파일의 [/Scripts/Engine.TextureLODSettings] 부분에 있습니다.
게임 개발을 위해 [your_game]\\Config\\DefaultDeviceProfiles.ini 파일에도 Engine\\Config\\ 폴더에 있는 기본 프로퍼티의 미러 세트가 들어 있습니다. 이 세트가 보통 게임의 특정 설정에 따라 변경되는 복사본입니다.