오늘은 Texture Atlas와 UV좌표계에 대해서 알아보도록 하겠습니다.
Texture Atlas는 여러 개의 작은 텍스처를 하나의 큰 POT 텍스처에 배치하는 방식이다.
아틀라스는 기본적으로 텍스처를 화면에 그릴때 최적화를 위하여 사용됩니다.
우리가 사용하고 싶은 텍스처들은 정말 다양한 크기가 존재합니다.
어떤 텍스처들은 Power Of Two(2의 거듭제곱)꼴로 나타내어진 256x256 512x512의 크기를 가진 텍스처도 있을것이고
그렇지 못한 텍스처도 분명 존재합니다.
- POT 텍스처 : 256x256, 512x512, 1024x1024
- NPOT(Non-Power of Two) 텍스처 : 300x500, 750x750
그러나 여기서 핵심는 그래픽연산을 수행하는 GPU는 POV형태의 텍스처를 가장 빨리 읽고 사용할 수 있습니다. (구형 cpu의 경우 NPOV인경우 읽는데 문제가 생길 가능성도 있습니다.)
또한 GPU는 그릴 텍스처를 여러번 바꾸게 되면 성능적인 저하가 발생합니다.
그러므로 이용할 [텍스처 이미지를 하나의 큰 POV형태의 텍스처에 모두 몰아 넣고 사용]하면 성능적인 향상을 기대할 수 있습니다.
UV 좌표계 - UV 좌표계는 3D 모델의 표면에 2D 텍스처를 매핑하기 위한 2D 좌표 시스템
- U는 텍스처 이미지의 가로 방향을 나타내며, 0에서 1까지의 값을 가짐.
- V는 텍스처 이미지의 세로 방향을 나타내며, 0에서 1까지의 값을 가짐.
예를 들자면 만약 u,v의 좌표가 (0.5,0.5)이고 텍스처의 크기가 1024x1024라고 가정하면 곱셈을 통해서 텍스처의 정확한 위치를 알아냅니다. (1024x0.5, 1024x0.5) = (512,512)
해당위치의 color값을 읽어와서 설정해주는 방식입니다.
uv좌표는 텍스처의 각 꼭짓점 좌표만을 넘겨주는데 그 사이의 값은 적절하게 보간됩니다. (interpolate)
왜 텍스처 아틀라스(Texture Atlas)가 성능적으로 유리할까?
1. 텍스처 스위칭(바인딩) 비용 감소
- GPU는 새로운 텍스처를 불러올 때마다 상태 변경(Binding Cost)이 발생함.
- 하나의 큰 텍스처를 사용하면, 여러 개의 작은 텍스처를 불러올 필요 없이 UV 좌표만 변경하면 됨.
- 결과적으로 Draw Call(드로우 콜) 수를 줄여서 성능 최적화 가능.
2. 캐시 효율 향상 (텍스처 캐시 히트율 증가)
- GPU는 텍스처 데이터를 2D 블록 단위(POT 크기)로 캐싱함.
- 여러 개의 작은 텍스처를 번갈아 가며 로드하면 캐시 미스(Cache Miss)가 증가해서 성능 저하 발생.
- 하나의 큰 텍스처에서 UV 좌표만 변경하는 방식은 연속적인 메모리 접근이 가능해서 캐시 성능이 향상됨. - 빠름
3. Batch Rendering(일괄 처리) 가능
- 서로 다른 텍스처를 사용하면 GPU가 Draw Call을 따로 수행해야 함.
- 하나의 텍스처 아틀라스를 사용하면 여러 개의 오브젝트를 한 번에 렌더링 가능해서 성능이 개선됨.
텍스처 아틀라스 적용 방법
1. 하나의 큰 텍스처 생성 (Atlas)
- 예: 1024x1024 크기의 하나의 텍스처에 여러 개의 작은 이미지 포함
- Power of Two (POT) 크기로 만드는 것이 성능적으로 유리함 (512x512, 1024x1024 등)
2. 각 오브젝트가 사용할 UV 좌표 계산 - vertex 정보 넘겨줄때 uv좌표도 함께 넣어주기
3. Shader에서 UV 좌표를 기반으로 텍스처 샘플링
- Vertex Shader는 개별 텍스처를 지정하는 대신, Atlas 내에서의 UV 좌표만 전달
- Pixel Shader는 이 UV 좌표를 사용해 Atlas에서 적절한 위치를 샘플링
결론: 텍스처 아틀라스를 사용하면?
Draw Call 감소 → CPU-GPU 통신 비용 절약
텍스처 캐싱 효율 증가 → 빠른 렌더링 가능
Batch Rendering 가능 → 동시 처리 성능 향상
'DirectX11' 카테고리의 다른 글
[DX11] Matarial Sorting을 통한 최적화 (0) | 2025.03.29 |
---|---|
[DX11] Constant Buffer에 값 넘길 때 주의할 점(Shader로 Matarial값 넘길 때 주의할점) (0) | 2025.03.26 |
[DX11] Shader에 Vertex넘길 때 주의 해야 할 점!! (Shader 디버깅 Tip) (0) | 2025.03.25 |
[DX11] UV좌표를 활용한 Text 렌더링 (0) | 2025.03.19 |
[DX11] Shader Resource View(SRV), Sampler에 대해서 (0) | 2025.03.18 |