| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- GPU
- hzb
- Wavefront
- SGPR
- DX12
- vulkan
- unrealengine
- GPU Driven Rendering
- optimization
- scalar
- Shadow
- texture
- SIMD
- forward
- 번역
- deferred
- Graphics
- Study
- ShadowMap
- atmospheric
- RayTracing
- VGPR
- DirectX12
- UE5
- ue4
- Nanite
- rendering
- shader
- wave
- scattering
- Today
- Total
RenderLog
[번역] Your Guide to Texture Compression in Unreal Engine 본문
개인 공부용으로 번역한 거라 잘못 번역된 내용이 있을 수 있습니다.
또한 원작자의 동의 없이 올려서 언제든 글이 내려갈 수 있습니다.
출처 : https://www.techarthub.com/your-guide-to-texture-compression-in-unreal-engine/
Your Guide to Texture Compression in Unreal Engine
Written by Nick Mowerin Optimization,Unreal

보통 텍스쳐는 언리얼 프로젝트 크기의 대부분을 차지합니다, 때때로 나머지 당신의 게임의 에셋을 모두 합한 것보다 더 많습니다. 많은 양의 텍스쳐 데이터를 체크하지 않은 채로 두는 것은 게임의 성능과 팀의 생산 속도를 저하시킬 수 있습니다. - 특히 큰 프로젝트에서
그럴 필요는 없습니다.(This doesn’t have to be the case.)
언리얼 여러 가지 텍스쳐 압축 세팅과 텍스쳐 속성 에디터에서 프리셋을 제공합니다. 이런 옵션들은 시각적으로 정확도에 최소한의 영향을 주면서 텍스쳐 데이터의 양을 크게 줄이기 위해서 다양한 방법으로 사용될 수 있습니다.
언리얼 텍스쳐 압축 툴을 최대한 활용하는 것은 어떻게 텍스쳐 압축이 작동하는지 그리고 에픽이 어떻게 그들의 시스템을 사용하려고 하는지에 관해서 조금만 이해하면 됩니다.
What is texture compression?
텍스쳐 압축은 텍스쳐 최적화라는 더 넓은 영역의 핵심 파트입니다, 성능을 향상 시키기 위해서 한 번에 텍스쳐의 양을 줄이는 방식, 그리고 당신의 게임에서 빌드 사이즈를 유지하고 로딩 시간을 줄이기 위해서 전체 텍스쳐 데이터의 양을 줄이는 것.
특히, 텍스쳐 압축의 목표는 보기에 필요가 없거나 덜 중요할 수 있는 것을 잘라내서 텍스쳐에 저장되는 데이터의 양을 줄이는 것입니다.
포토샵과 같은 이미지 에디터 프로그램으로부터 때 얻는 이미지 압축의 종류와는 다르게, 게임엔진에서 찾을 수 있는 텍스쳐 압축 포맷은 리얼타임 애플리케이션에 특화되어 고안되었습니다. 일반적으로, 압축이 빠르고 융통성 있다는 의미입니다만 무손실을 아닙니다.
늘 그렇듯, 모든 종류의 데이터 압축에서 시각적 품질과 파일의 크기는 트레이드오프입니다. 게임엔진에서 이것은 그래픽의 정확성과 성능 사이의 트레이드오프로 번역됩니다.
My demo textures
이 글에서 우리가 알아볼 다른 세팅들을 설명하기 위해서 간단한 텍스쳐를 사용할 것입니다. 그들이 기대하는 일종의 시각적 정확도의 지표를 줄 수 있기를 바랍니다. 여기서 보는 모든 것은 추가적으로 피할 수 없는 jpg 압축 레이어가 있다는 것을 기억하세요 그래서 그것은 1:1이 아닐 것입니다. (Keep in mind that anything you see here will have an additional unavoidable layer of jpg compression so it won’t be 1:1.)

이 가이드의 모든 스크린샷과 통계는 DirectX12를 구동하는 내 머신에서 가져왔습니다.
A note about color depth
이미지의 color depth는 각 픽셀의 컬러 데이터를 저장하기 위해서 얼마나 많은 메모리가 사용되는지 나타냅니다. 만약 이미지가 8-bit color depth면, 각 픽셀의 컬러 값은 8 비트의 데이터에 저장됩니다. 이 정보는 보통(항상 그렇진 않음) 조합되어 최종 컬러를 생성하는 여러 컬러 채널에 퍼져있습니다. 8-bit 이지미의 경우, 3 비트는 빨강 채널, 3비트는 녹색 채널, 2비트는 파랑 채널에 있습니다.

Color/Bit depth는 메모리에서의 전체적인 크기뿐만 아니라 텍스쳐의 컬러 범위를 정의합니다. 아래의 테이블은 이 가이드의 나머지 부분에서 참고할 더 일반적인 color depth formats를 담고 있습니다.

만약 color depth와 그것이 어떻게 저장되는데 대해서 더 배우는데 더 관심이 있다면, 이 비디오는 좋은 입문서입니다.
The Texture Properties Editor
이글에서 보는 모든 설정은 텍스쳐 속성 에디터에서 발견했습니다, 이것은 컨텐츠 브라우저의 아무 텍스쳐 파일을 더블클릭하여 볼 수 있습니다.
이 에디터는 조작 가능한 수많은 옵션을 포함합니다. 여기에 오늘 우리가 이야기해볼 적절한 것이 있습니다.

언리얼 엔진4의 텍스쳐 속성 에디터
디테일 패널의 가장 위에서 당신의 텍스쳐 해상도의 개요를 볼 수 있습니다, 디스크에서 크기, 스트리밍 방식, 압축 포맷 그리고 밉맵 정보. 우리가 실험한 서로 다른 압축방식에서, 반영된 변화를 여기서 볼 수 있습니다, 그래서 우리는 이 개요를 보러 자주 다시 올 것입니다.
텍스쳐 통계의 바로 아래는 압축 선택 부분입니다. 이곳에서 우리는 가능한 최고의 결과를 얻기 위해서 텍스쳐의 압축 설정을 조작할 수 있습니다.
Compress Without Alpha
꽤 직관적인 부분입니다. 만약 Compress Without Alpha 가 체크되어 있다면, 텍스쳐의 알파채널은 압축 중에 제거 될 것입니다. 이것은 알파채널이 있는 텍스쳐는 당신이 어떤 압축 포맷을 사용가능한지 알려줄 것이기 때문에 것이기 때문에 대부분의 적절한 설정일 것입니다.
만약 소스 텍스쳐에서 알파채널이 없다면, 이 설정은 효과가 없습니다.
Defer Compression
기본적으로 에디터는 압축 설정을 변경할 때마다 당신의 텍스쳐의 재압축을 시도합니다. 파일을 갱신할 때, 특히 큰 텍스쳐 파일이나 더 낮은 스펙의 시스템에서 업데이트하는 경우 당신은 히칭을 느낄 수 있습니다.
만약 이게 문제가되면, Defer Compression 체크박스를 체크할 수 있습니다 그러면 엔진은 에셋을 저장할 때만 재압축을 할 것입니다.
Compression Settings
압축 세팅 드롭다운은 텍스쳐의 압축 프리셋들을 선택할 수 있도록 해줍니다. 이런 프로파일은 파일의 크기를 줄이기 위해서 사용될 알고리즘 종류를 설정하기 때문에 중요합니다. 각각의 프로파일은 자신만의 장점과 단점이 있습니다, 그러나 에픽에서 사용될 것이라고 예상되는 가장 일반적인 사용 예를 따라서 이름을 지어서 올바른 압축을 찾는 것이 어렵지 않습니다.
압축 프로파일의 이름에서 얻을 수 있는 가장 중요한 정보는 사용 예가 아닙니다, 오히려 괄호 안에 있는 문자가 중요합니다. 이 문자와 숫자는 각 프로파일에 의해 활용될 특정 압축 포맷을 알려줍니다. 그리고 뒤에서 어떤 일을 하는지 힌트를 줍니다.
Side notge:압축 프로파일의 이름은 사용되어야 하는 대상을 항상 나타내지는 않습니다. 강력한 제안이라고 생각하고 당신의 프로젝트의 정확한 요구사항에 맞는 것을 제공하는 최고의 포맷 프로파일을 선택하는 게 좋습니다.
리스트를 봅시다.
Default (DXT1/5, BC1/3 on DX11)
가장 효과적인 압축 프로파일. 알베도/디퓨즈 텍스쳐에 사용됩니다.
Default 는 가장 일반적인 알베도/디퓨즈 텍스쳐 맵 같은 non-linear (or gamma-corrected) 컬러 정보를 사용하는 텍스쳐용 압축 프로파일입니다. 당신의 텍스쳐 소스에 알파 채널이 있는지 여부에 따라서 두 S3 Texture Compression (S3RC) 중 하나를 사용합니다.
만약 텍스쳐가 알파채널이 없다면, 엔진은 DXT1 이라 불리는 포맷을 사용합니다. 이것은 언리얼에 제공하는 가장 성능이 좋은 압축 포맷입니다, 그리고 여섯 개의 요소에 의해 텍스쳐의 크기가 줄어들 것입니다. 만약 알파채널이 있다면, 이것은 DXT5 라 불리는 다른 것을 사용할 것입니다, 이것은 네 개의 요소에 의해 텍스쳐의 사이즈를 줄입니다.



이 프로파일을 사용할 때, 알파채널의 추가는 세 개의 다른 채널과 조합할 때와 같은 양의 디스크 공간을 차지합니다. 디퓨즈 맵에 이것을 추가하기 위해서 결정하기 전에 고려해야할 부분입니다.
Side note: DXT 압축은 삼각형 모양의 artifact를 만드는 경향이 있습니다, 이런 방식은 이미지를 4x4 픽셀의 사각형으로 나누고 그 값을 근사하는 형태로 처리하여 텍스쳐의 크기를 줄입니다. 이것은 노이즈가 많은 알베도 텍스쳐 맵에 대해서는 문제가 되지 않습니다만 부드러운 경사도(Gradient)나 픽셀 아트와 같은 것에는 적합지 않습니다.


더 많은 정보(S3 텍스쳐 압축과 그것이 어떻게 동작하는지에 대한 방대한 분석을 포함)은 Joost van Dongen’s development 블로그를 확인하세요.
DirectX11이나 그 위 버전을 사용한다면, 엔진은 뒤에서 S3 텍스쳐 압축 대신에 알파채널의 존재 여부에 따라 BC1 또는 BC3 을 사용합니다. BC (블록 압축의 약자) 1 그리고 3은 DXT1 그리고 DXT5 의 새로운 이름입니다. 내가 이해하기로는 구현이 실질적으로 동일합니다.
Normalmap (DXT5, BC5 on DX11)
노멀맵에 적합하며 (그리고 아마도 flow maps 에도) 그게 전부입니다.
이 프로파일에 사용 가능한 것은 아마도 BC5 일 것입니다, 이 S3TC 포맷은 노멀맵을 위해 최적화되어있습니다. 만약 BC5 를 사용할 수 없다면, 위에서 논의한 DXT5 를 사용할 것입니다.



BC5 압축은 소스의 파란색 채널을 제거함으로써(이것은 프로그램에서 요구하는 방식으로 채워짐) 압축된 2채널 16 비트 텍스쳐를 생성합니다. 텍스쳐의 초록색 정보를 알파채널의 8비트 채널로 그리고 남은 8 비트는 빨강을 저장하는 데 사용합니다. 이것은 노멀맵 압축을 아주 효율적이게 하며 다른 것은 없습니다.
BC5 는 원본 텍스쳐의 파랑과 알파 채널을 제거하는 것을 기억하세요, 만약 당신이 이 채널을 남겨야 한다면 다른 프로파일을 사용해야 합니다(만약 그랬다면, 머터리얼 에디터에서 당신이 노멀맵이 올바르게 작동하기 위해서 이러한 우회법이 필요할 수 있습니다.)
Masks (no sRGB)
기본 프로파일과 동일, 그러나 중요한 예외가 하나 있음
Mask 프로파일은 Default 와 동일합니다. 이것은 알파채널을 사용하지 않는다면 DXT1 포맷을 사용할 것이며, 사용한다면 DXT5 를 사용합니다. 이 둘의 차이점은 Masks 는 sRGB를 지원하지 않는 것입니다, 그래서 모든 텍스쳐 데이터는 선형 공간으로 제공됩니다.



sRGB에 관한 자세한 점과 어떻게 작동하는지를 알아보는 것은 이 가이드의 범위를 벗어날 것이지만 빠르게 요약하면, sRGB는 감마 콜렉션 형태입니다. 감마 콜렉션은 특정 하드웨어에 상관없이 당신의 텍스쳐 컬러가 디스플레이에서 올바르게 표시되도록 보장해줍니다. 수학적으로 정밀한 데이터 (노멀맵이나 물긴 기반 렌더링 마스크와 같은)를 위해 사용되는 텍스쳐들은 sRGB를 활성화하지 않을 것입니다.
Slide note:이것을 지원하는 압축 프로파일에서, sRGB는 속성 에디터의 텍스쳐 부제 아래에 있는 체크박스를 통해서 활성/비활성 할 수 있습니다. Mask 프로파일은 기능상 Default 프로파일에서 sRGB 설정을 체크하지 않은 것과 동일합니다.
Grayscale (R8, RGB8 sRGB)
여러 목적의 비압축된 단일 채널 포맷
이 프로파일은 단일 채널 8비트 포맷인 G8 을 사용합니다. 약간 혼란스러운 것이, 이 프로파일 이름에서 R8 이름 붙여져 있습니다. 왜냐하면 텍스쳐의 초록, 파랑 그리고 알파 채널을 버리고 비압축된 8비트 버젼의 빨강을 제공하기 때문입니다.


Grayscale 은 sRGB 또한 지원합니다, 그러나 만약 활성화한다면 프로파일은 비압축 포맷 B8G8R8A8 이라 불리는 포맷으로 전환됩니다, 그래서 당신의 이미지는 동일한 네 개의 채널이 있는 32 비트 RGBA 이미지로 변환됩니다. 당신이 예상한 데로, 이것은 아주 크게 당신의 텍스쳐 크기를 증가시킵니다. 나는 당신이 이것이 필요하지 않을 것이라 생각합니다.
Displacementmap (8/16bit)
Displacement에 사용하기 위한 비압축 8비트 그레이스케일.
그레이 스케일처럼, Displacementmap 프로파일 또한 비압축된 단일 채널 텍스쳐맵을 생성하기 위해서 G8 압축을 (또는 sRGB가 활성화된 B8G8R8A8) 사용합니다. 그러나, 이 프로파일은 알파채널에 있는 정보를 사용하고 나머지는 버립니다.
이름에서 알 수 있듯, 이것은 displacenment/height map을 위해서 고안되었습니다.

Side note: 나는 이 프로파일이 왜 8/16bit 라는 부분을 이름에 포함하는지 모릅니다. 아마도 단일 채널 16 비트 이미지 또한 지원하려는 의도인 것 같습니다. 무엇을 입력하든 출력은 8 비트 이미지를 출력하는 것으로 보입니다만 이것은 순수하게 내 추측입니다. 만약 당신이 이 미스테리에 대한 생각이 있다면 부디 여기로 연락주세요!
VectorDisplacementmap (RGBA8)
버택스 애니매이션 그리고 다른 3D displacement 목적의 비압축 32비트 RGBA 포맷
VectorDisplacementmap 프로파일은 (이 프로필의 이름의 대소문자가 일치하지 않아 조금 불편한 사람 있나요?) 4개의 8비트 채널 B8G8R8A8 를 사용하는 크고 비압축인 이미지를 제공합니다.
B8G8R8A8 포맷을 사용할 때 주의점은, 알파 채널은 필수입니다(Compress Without Alpha 설정을 오버라이드 할 것입니다) 그래서 만약 당신이 텍스쳐의 XYZ 위치 데이터를 저장한다면, 당신이 4번째 채널을 용량에 관계없이 언제든지 활용할 수 있다는 그런 장점을 염두하세요.
HDR (RGB, no sRGB)
128비트 HDR 이미지. 이미지 기반 라이팅이나 스카이 박스에 사용에 추천됨.
HDR 프로파일은 FloatRGBA 라 불리는 압축 포맷을 사용합니다, 이것은 채널당 32비트의 색상 정보를 사용하여 더 깊은 color depth를 지원합니다.
HDR 컬러 값은 floats (소수점 이하 자릿수를 가질 수 있는 큰 숫자)에 저장되며 B8G8R8A8 같이 정수(integers/whole number)가 아닙니다.

HDR은 sRGB를 지원하지 않습니다, 이름에 나와있는 내용에도 불구하고 당신이 원하든 말든 이것은 알파채널을 추가합니다, 그래서 그것을 활용하는 것이 좋습니다.
Side note:빠르게 상기해보면, 이 페이지에서 내가 사용하는 이미지는 채널 당 8비트 정보를 가지는 24비트 jpg라는 점입니다, 그래서 당신은 이 예제에서 값의 범위의 증가를 볼 수 없을 것입니다.
Userinterface2D (RGBA)
HDR 과 같습니다, 그러나 sRGB 를 지원합니다. 이 프로파일은 당신의 이미지를 최대한 정확하게 표현합니다.
인터페이스 요소와 함께 사용되기 위해서, 이 프로파일은 가능한 최고의 결과를 제공하기 위해서 B8G8R8A8 (최대 32비트 이미지)나 FloatRGBA (최대 128비트 이미지)를 사용할 것입니다. 언제나처럼, 비압축 텍스쳐는 큰 공간을 차지합니다.
Userinterface2D 는 sRGB를 지원합니다.
Alpha (no sRGB, BC4 on DX11)
DirectX11이나 이상에서는 일반적으로 16비트 그레이스케일 포맷을 사용합니다.
이 프로파일은 알파 마스크를 위한 것입니다, 그러나 또한 여러 용도의 아주 유용한 그레이스케일 포맷입니다. 소스 텍스쳐의 빨간색 채널로부터 압축된 16 비트 그레이스케일 이미지를 생성할 것입니다.


Alpha 는 BC4 라 불리는 S3 텍스쳐 압축 포맷을 사용합니다. 다른 S3 압축 포맷과는 같이, Alpha 는 이미지를 4x4 픽셀 청크로 쪼깨서 데이터를 제거합니다, 이것은 특정 상황에서 격자 모양의 artifact를 유발합니다.
sRGB는 지원하지 않습니다.
DistanceFieldFont (R8)
디스턴스 필드 폰트를 위한, 또 다른 비압축 그레이스케일 포맷
DistanceFieldFont 프로파일은 어떤 면에서 보나 Displacementmap과 가습니다. 알파채널을 제외한 모든 값을 버리는 G8 압축을 사용하는 8 비트 그레이 스케일입니다.
숨어서 다른 일을 하고 있을 수도 있지만, 나는 지금까지 차이를 발견하지 못했습니다.
HDRCompressed (RGB, BC6H, DX11)
HDR 이미지를 위해 압축된 포맷, DirectX와 그 이상에서만 지원됨.
이 프로파일은 high dynamic range 컬러에서 16 비트 채널을 지원하는 BC6H 라 불리는 새로운 압축 포맷입니다. 이것은 'half' floats (full float은 32비트 데이터를 가짐)를 사용하여 얻어집니다. HDRCompressed 프로파일은 절반 크기의 공간을 데이터를 저장하는데 씁니다, 그리고 절반의 컬러 범위입니다. 이것은 여전히 수십억 개의 색상을 표현합니다 - 인간의 눈이 볼 수 있는 것보다 훨씬 더 많음.

비압축 HDR 프로파일과 같이, HDRCompressed 프로파일은 sRGB를 지원하지 않습니다.
BC7 (DX11, optional A)
DirectX11 그리고 더 높은 것을 위한 새로나온 더 정확도가 높은 압축 포맷
BC7 는 DirectX11 과 함께 출시되었습니다, 그리고 다양한 방법을 사용하여 4채널 텍스쳐 데이터를 인코딩하는 더 발전된 S3 압축 포맷입니다. 이것은 DXT1/5 같이 오래된 포맷보다 더 적은 artifact를 가진 더 높은 품질의 압축을 제공합니다, 그리고 sRGB를 지원합니다.

BC7 포맷은 알파채널을 포함합니다, 만약 당신의 소스 텍스쳐에서 알파채널이 없다면 시스템은 알파채널을 만들 것입니다. Compress Without Alpha setting 는 오버라이드 될 것입니다.
Half Float (R16F)
비압축 16 비트 그레이스케일 이미지
이 싱글 채널 포맷은 당신의 빨강 채널에 있는 모든 것을 16비트 half float 값으로 인코딩할 것이고 나머지를 버릴 것입니다. 일반적인 16비트 텍스쳐처럼, 이것은 G8과 같은 포맷과 비교하여 훨씬 높은 범위의 컬러 값을 만들어줍니다.

Half Float 는 Compress Without Alpha 를 오버라이딩 하여 알파채널을 강제합니다.
흥미롭게도, 이 포맷은 공식 문서에서 빠져있습니다.
Default (DXT5)
비압축 32 비트 RGBA 텍스쳐 (이 제목에 나와있음에도 불구하고)
혼란스럽게도 이름 또한 Default, 이 프로파일은 비압축 4채널 이미지를 위해 우리의 표준 B8G8R8A8 을 사용합니다. 나는 이것이 무슨 의도인지 모르겠습니다.
이 포맷은 또한 공식 문서에서 빠져있습니다.

Quick-reference guide
텍스쳐 압축에 대해서 이야기할 때 필수적으로 우리는 수많은 이니셜을 마구 던지는 경향이 있습니다. 이것은 상당히 어려울 수 있습니다. 나는 이 짧은 레퍼런스 가이드가 약간의 컨닝 페이퍼 역할을 할 수 있길 바라고 다른 포맷과 비교하여 어느 것이 당신의 프로젝트에서 가장 좋은지 찾는데 도움을 주면 좋겠습니다.
Compressed formats

* BC7 는 다른 Color depth 그리고 비트 분포로 8개의 다른 모드를 가지고 있습니다. 이것은 분석하기 조금 어렵습니다. Microsoft’s website 에서 더 많은 것을 읽어볼 수 있습니다.
** BC6H 그리고 BC7 의 압축 비율에 대한 정보를 찾기 어려웠습니다. 왜냐하면 그들의 인코딩 알고리즘이 단순하지 않기 때문입니다. 지금까지 내가 찾은 최고의 답은 '복잡하다' 입니다.
Uncompressed formats

Stay tuned!
이 글은 수많은 연구와 실험의 결과입니다, 그래서 언젠가 실제 텍스쳐 압축 정보를 위한 결정적인 리소스가 되길 바랍니다. 현재로서는 아직 진행 중인 작업입니다.
읽어주셔서 감사합니다, 이것이 유용하길 바랍니다, 만약 내가 사용한 언어가 혼란스럽거나 또는 결함이나 사실상 오류가 있다면, 주저하지 말고 연락주세요. 나는 여러분과 함꼐 이 자료를 가능한한 최고의 자료로 만들고 싶습니다.
추후 업데이트에 다룰 주제:
- Compression Quality
- Crunch compression
- Texture compression for mobile devices
- Recommended use-cases
'Graphics > 참고자료' 카테고리의 다른 글
| [번역] Monte Carlo Integration Explanation in 1D (0) | 2022.04.09 |
|---|---|
| [번역] Monte Carlo Integration (2) | 2022.03.12 |
| [번역] Visibility Buffer Rendering with Material Graphs – Filmic Worlds (2) | 2021.10.15 |
| [번역] Temporal Anti-Aliasing(TAA) Tutorial (0) | 2021.06.24 |
| [번역] Graphics API abstraction – Wicked Engine Net (0) | 2021.05.15 |