지식

[Graphics] 텍스처, 실시간 그림자 처리

라구넹 2025. 5. 30. 16:20

텍스처 압축 방식

3D 그래픽에서 사용되는 이미지 데이터를 효율적으로 저장하고 전송하기 위해 사용되는 기술

DXT(S3TC), ETC, PVRTC, ASTC 등의 압축 방식이 있음

 

DXT / S3TC(S3 Texture Compression)

플랫폼: 주로 PC, Xbox, 일부 안드로이드

 

형식

- DXT1: RGB (또는 1비트 알파), 4bpp

- DXT3: RGBA (명확한 알파), 8bpp

- DXT5: RGBA (인터폴레이션된 알파), 8bpp

 

장점

- GPU에서 바로 사용 가능 (압축 해제 필요 없음)

- DirectX 기반 시스템에서 널리 지원됨

단점

- 블록 크기가 고정(4x4 픽셀), 작은 디테일 표현에 약함

- 알파 압축 품질이 낮음

 

ETC (Ericsson Texture Compression)

플랫폼: OpenGL ES를 사용하는 안드로이드 기기 표준 

 

형식

- ETC1: RGB Only, 4bpp (알파 없음)

- ETC2: RGB / RGBA

 

장점

- 모바일 GPU에서 널리 지원

- ECT2는 알파까지 지원, DXT 품질에 근점

단점

- ECT1은 알파를 지원하지 않아 별도 처리 필요

- ECT2는 구형 기기에서 지원 안될 수 있음

 

PVRTC (PowerVR Texture Compression)

플랫폼: iOS 등

 

형식

- PVRTC1: RGB/RGBA, 2bpp 또는 4bpp

- PVRTC2: 더 나은 품질, 유연한 블록 레이아웃

 

장점

- iOS 디바이스에서 하드웨어 수준 지원

- 낮은 비트레이트에도 양호한 품질

단점

- 압축 아티팩트(간단히, 데이터 손실 압축 시 발생하는 오류) 발생 가능

- 인코딩 복잡도 및 툴 체인 제약

 

ASTC (Adaptable Scalable Texure Compression)

플랫폼: 최신 OpenGL ES 3,2, Vulkan, .. 최신 플랫폼

 

형식

다양한 블록 크기(4x4 ~ 12x12), 비트레이트 조절 가능

 

장점

- 매우 유연한 블록 크기 -> 품질과 압축률 조절 가능

- 높은 품질, RGBA 및 HDR까지 지원

단점

- 인코딩 속도 느림

- 구형 디바이스 지원 여부

 

* HDR (High Dynamic Range)

밝기와 색상의 표현 범위를 넓혀주는 기술

 

핵심 개념

- 밝은 영역은 더 밝게, 어두운 영역은 더 어둡게, 중간 영역은 더 풍부한 색감으로

- 기존 SDR(Standard Dynamic Range)보다 훨씬 넓은 명암비와 색 영역 표현 가능

 


 

텍스처 아틀라스(Texture Atlas)

여러 개의 작은 텍스처 이미지를 하나의 큰 이미지에 모아놓은 것

 

장점

1. 드로우 콜 감소

2. 배칭 최적화

- 많은 오브젝트가 하나의 머티리얼로 처리 가능

3. 로드 효율 증가

- 애니메이션 스프라이트에 적합

 

단점

1. UV 좌표 관리 복잡

2. 텍스처 블리딩(Texture Bleeding) 문제

- mipmap 적용 시 인접 이미지 경계가 섞여 보일 수 있음 => 패딩 필요

3. 크기 제한

- 너무 커지면 GPU에서 지원하는 최대 텍스처 해상도를 넘길 수 있음

4. 압축 효율 저하 가능성

- 서로 다른 성격(컬러, 투명도)의 텍스처가 하나로 합쳐지면 압축 품질 저하될 수 있음

- ex. 투명 텍스처와 불투명 텍스처가 같은 아틀라스에-> DXT1? 5?

 

* Mipmap

텍스처의 다양한 해상도 버전을 미리 만들어 놓는 기술

멀리 있거나 작게 보일 때 성능과 품질을 동시에 높이기 위해 사용

텍스처 버전의 LOD

 

장점

- 렌더링 성능 향상

- 시각 품질 향상

    - 축소된 텍스처에 고해상도 이미지 강제로 쓰면 깜빡임 발생

- GPU 최적화

    - GPU는 삼선형 필터링(Trilinear filtering), 이방성 필터링(Anistropic Filtering)등 자동 활용 가능

 

단점

- 메모리 증가

- 생성 시간 증가

- 품질 저하 가능성 (너무 작은 mipmap)

 


 

실시간 그림자 처리의 원리

가장 기본적이고 널리 쓰이는 기법: Shadow Mapping

 

Shadow Mapping?

빛의 시점에서 장면을 렌더링하여 깊이 정보를 저장한 뒤 카메라에서 그 장면을 볼 때 그림자인지 여부를 비교해서 결정하는 방법

 

1단계: Depth Map 생성

- 빛을 카메라라고 생각하고 장면을 깊이만으로 렌더링

- 이때 Shadow Map(깊이 텍스처)가 생성됨

- 각 픽셀은 빛에서 물체까지의 거리를 저장

 

2딘계: 카메라에서 본 장면 렌더링

- 카메라에서 장면을 렌더링할 때 각 픽셀이 그림자 안에 있는지 확인하려면

    - 해당 픽셀의 월드 좌표를 빛의 좌표계로 변환

    - Shadow Map에서 대응하는 깊이값과 비교

 

if( DepthFromLight > ShadowMapDepth + bias ) -> 그림자

* bias는 오차 보정값

 

장점

- 간단, GPU 친화적(텍스처 기반 처리), 다양한 광원에 적용 가능

단점

- 앨리어싱

- 피터 패닝(Peter Panning, 그림자가 붕 뜨는 현상.. bias 너무 큰 경우)

- Shadow Acne (표면에 얼룩처럼 그림자 생기는 문제, bias 너무 작은 경우)

- Perspective Wrapping (그림자 분포가 비효율적일 수 있음)

 

이후 개선

PCF(Percentage Closer Filtering): 부드러운 그림자 경계 생성

CSM(Cascaded Shadow Maps): 가까운 곳은 고해상도 그림자 먼 곳은 저해상도

VSM(Variance Shadow Mapping): 그림자 부드럽게 하면서 성능 개선

ESM, MSM 등..