[Graphics] 텍스처, 실시간 그림자 처리
텍스처 압축 방식
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 등..