텍스처에서 UV 좌표의 색상값을 읽어온다. 필터링 방식에 따라 품질과 성능이 달라진다.

 

UV로 텍스처에서 색상을 읽는 것이 핵심 기념이다.

 

픽셀 셰이더에서 텍스처 읽기

ex) UV 좌표 (0.5, 0.3)이 들어온다.

텍스처 (1024x1024)에서 U = 0.5 -> 512번째 열, V = 0.3 -> 307번째 행

그 위치의 색상을 읽어서 반환한다.

 

문제1. UV 좌표가 정수가 아닐 수 있다. 소수는 정확히 픽셀 경계에 떨어지지 않는다.

-> 사이 값을 어떻게 읽을 것인가

-> 필터링 방식에 따라 결정된다.

 

문제2. 화면의 픽셀 하나가 텍스처의 여러 픽셀에 걸칠 수 있다. (오브젝트가 작게 보일 때)

-> 밉맵으로 해결이 된다.

 

필터링 방식 4종류

 

1. Nearest (Point) Filtering

- 가장 가까운 텍셀 하나만 읽는다

- 픽셀화된(Pixelated) 결과

- 비용이 가장 낮다

 

ex) 텍스처에서 (4x4)에서 UV(0.37, 0.25) 읽기

U -> 0.37 * 4 = 1.48 -> 반올림 -> 1번 열

V -> 0.25 * 4 = 1.00 -> 반올림 -> 1번 행

-> 1,1 텍셀 하나만 반환한다.

 

용도로는 픽셀 아트 게임, 디버깅이 있다.

 

2. Bilinear Filtering

- 가장 가까운 4개 텍셀을 선형 보간

- 부드럽지만 먼 거리에서 흐릿하다

- 비용이 낮다. (GPU 하드웨어 가속)

 

TL TR

■ ■

↕ 가중치 보간

■ ■

BL BR

 

- result = lerp(lerp(TL, TR, fx), lerp(BL, BR, fx), fy)

- fx, fy = 소수점 부분 (보간 가중치)

 

용도로는 모바일 기본값, 대부분 상황에서 적절하다.

 

3. Trilinear Filtering

- Bilinear + 밉맵 레벨 간 보간

- 밉맵 전환 시 경계선이 안 보인다.

- Bilinear보다 비용이 약간 높다

 

밉맵 레벨 2 (Bilinear 결과)

보간

밉맵 레벨 3 (Bilinear 결과)

 

용도로는 PC 게임 기본값, 밉맵 팝핑 방지가 있다.

 

4. Anisotropic Filtering (AF)

- 비스듬한 각도에서 텍스처 품질 유지

- 여러 방향으로 여러 샘플로 읽는다

- 가장 비용이 높다. (AF 16x = 최대 16샘플)  그러나 성능 대비 품질이 가장 좋다

 

바닥 텍스처름 비스듬히 볼 때

Trilinear : 멀어질수록 흐릿하고 찌그러진다.

AF 16x : 선명하고 정확한 형태 유지한다.

 

용도로는 PC 고품질 설정의 기본값이다.

 

밉맵(Mipmap) - 텍스처의 LOD

 

밉맵이 필요한 이유

- 텍스처 1024x1024인 경우 오브젝트가 멀어져서 화면에 10x10 픽셀로 보인다.

 

밉맵이 없는 경우

- 10x10 픽셀을 그리려고 1024x1024에서 샘플링

- 텍스처의 극히 일부만 쓰고 나머지는 버린다

-> 앨리어싱(깜빡이는 현상), 캐시 미스 (메모리 비효율) 발생

 

밉맵이 있을 경우

1024x1024 (Level 0)

512x512 (Level 1)

256x256 (Level 2)

128x128 (Level 3)

...

2x2 (Level 9)

1x1 (Level 10)

 

오브젝트가 10x10으로 보이면

- 16x16 레벨 밉맵 사용

- 적절한 해상도에서 샘플링

- 앨리어싱이 없고 캐시가 효율적이다

 

메모리 비용 : 원본의 33% 추가. 수학적으로 1 + 1/4 + 1/16 + ... = 4/3 ≈ 1.33'

 

밉맵 레벨 선택 계산

-> GPU가 어느 밉맵을 쓸지 결정하는 방법

 

LOD 편향(Bias) 계산

- 인접 픽셀과의 UV 변화량(ddx, ddy) 측정

- UV가 많이 변하면 -> 작은 밉맵 (낮은 해상도)

- UV가 조금 변하면 -> 큰 밉맵 (높은 해상도)

 

GLSL에서

- float lod = textureQueryLod(sampler, uv).x;

 

HLSL에서

- float2 dx = ddx(uv * textureSize);

- float2 dy = ddy(uv * textureSize);

- float lod = 0.5 * log2(max(dot(dx, dx), dot(dy, dy)));

 

직접 밉맵 레벨 지정도 가능하다

- HLSL : texture.SampleLevel(sampler, uv, mipLevel)

- GLSL : textureLod(sampler, uv, mipLevel)

 

컴퓨트 셰이더에서는 자동 계산이 불가하다 -> SampleLevel로 직접 지정 필요하다.

 

샘플러(Sampler) - 샘플링 방식을 담은 오브젝트

 

텍스처 vs 샘플러

- 텍스처 : 픽셀 데이터를 저장하는 것

- 샘플러 : 텍스처를 어떻게 읽을지 설정하는 것

 

같은 텍스처를 다른 방식으로 읽을 수 있다.

샘플러 A : Bilinear + Repeat

샘플러 B : Nearest + Clamp

-> 텍스처 복사 없이 다른 결과

 

샘플러 설정 항목

- Filter : Nearest / Bilinear / Trilinear / Anisotropic

- Wrap U : Repeat / Clamp / Mirror / Border

- Wrap V : (U와 독립적으로 설정 가능)

- Mip Bias : 밉맵 레벨 편향 (+ 더 흐릿, - 더 선명)

- Max Aniso : AF 최대 샘플 수 (2x, 4x, 8x, 16x)

- Min/Max LOD : 밉맵 레벨 제한

 

HLSL에서

SamplerState linearSampler {
    Filter   = MIN_MAG_MIP_LINEAR;  // Trilinear
    AddressU = WRAP;
    AddressV = WRAP;
    MaxAnisotropy = 16;
};

 

텍스처 Wrap 모드

- UV가 0~1 범위를 벗어날 때 동작한다

 

1.Repeat (Wrap)

- UV = 1.7 -> 0.7과 동일

- 텍스처가 반복되기에 바닥, 벽, 반복 패턴에 사용한다

 

2. Clamp

- UV = 1.7 -> 1.0으로 고정

- 가장자리 픽셀이 늘어난다.

- UI, 스프라이트에 사용하며 UV 경계 밖에 다른 텍스처가 없어야 할 때 사용한다

 

3. Mirror

- UV = 1.7 -> 0.3과 동일 (뒤집어서 반복한다)

- 반복되지만 이음새가 자연스러워 대칭 텍스처에 효과적이다

 

4. Border

- UV 범위 밖 = 지정된 색상 (보통 검정색)

- 섀도우 맵에서 사용하며 범위 밖은 그림자 없음으로 처리한다.

 

텍스처 샘플링과 GPU 캐시

 

GPU 텍스처 캐시 동작

- 인접한 픽셀은 UV 좌표를 가진다.

-> 인접한 텍셀을 읽을 가능성이 높다.

-> GPU 텍스처 캐시에 이미 로드된 경우가 많다

-> 캐시 히트가 발생하며

-> 빨라진다.

 

캐시 미스가 생기는 경우

- UV 좌표가 불규칙적으로 점프한다

-> 예측 불가능한 메모리 접근

-> 캐시 미스 증가

-> 메모리 지연 발생 (Latency)

 

밉맵의 캐시 효율

- 원본(1024x1024) 대신 축소 밉맵(16x16) 사용한다

-> 읽는 데이터 크기 감소한다

-> 캐시에 더 많이 들어간다

-> 캐시 히트율이 증가한다

 

텍스처 압축 (BC/DXT)

- 압축된 상태로 GPU 캐시에 저장한다

- 같은 캐시에 더 많은 텍셀 저장한다. -> 캐시 효율 향상된다

 

텍스처 압축 포맷 - 플랫폼별

 

PC (DirectX)

- BC1 (DXT1) : RGB, 불투명, 4bpp

- BC3 (DXT3) : RGBA, 반투명, 8bpp

- BC4 : 단일 채널 (R), 4bpp

- BC5 : 두 채널 (RG), 8bpp  -> 노멀 맵

- BC6H : HDR 텍스처, 8bpp

- BC7 : 고품질 RGBA, 8bpp

 

모바일 Android

- ETC1 : RGB, OpenGL ES 2.0 이상

- ETC2 : RGB/RGBA, OpenGL ES 3.0 이상

- ASTC : 가변 압축률, 최신 표준

 

모바일 iOS (Apple)

- PVRTC : PowerVR GPU 전용

- ASTC : Apple A8 이상 지원

 

공통

- 압축된 상태로 GPU에 저장/사용한다

- CPU 복원은 없으며 메모리 대역폭이 절약된다.

- 4x4 픽셀 블록 단위로 압축한다.

 

연결되는 단어들

- 텍스처 캐시 : GPU가 최근 읽은 텍셀을 저장하는 온칩 캐시. 인접 픽셀이 인접 텍셀을 읽는 특성으로 높은 히트율. 무작위 UV 접근은 캐시 미스 증가한다.

- 텍셀 (Texel) : Texture Pixel의 합성어로 텍스처의 개별 픽셀이다. 화면 픽셀과 구분하기 위해 사용된다.

- 앨리어싱 (Aliasing) : 밉맵 없이 원거리 텍스처를 샘플링할 때 생기는 깜빡임. 밉맵과 필터링으로 방지한다.

- 텍스처 스트리밍 (Texture Streaming) : 필요한 밉맵 레벨만 동적으로 GPU 메모리에 로드된다. 메모리 사용량 최적화의 핵심이다

 

'Word' 카테고리의 다른 글

버텍스 셰이더 (Vertex Shader)  (0) 2026.07.31
렌더링 파이프라인 (Rendering Pipeline)  (0) 2026.07.29
오버드로우 (Overdraw)  (0) 2026.07.27
UV 매핑 (UV Mapping)  (0) 2026.07.22
노멀 맵 (Normal Map)  (0) 2026.07.21

+ Recent posts