1. 텍스처 샘플링 (Texture Sampling) 개요
텍스처 샘플링(Texture Sampling)은 픽셀 셰이더(PS)가 수행하는 기는 중 하나이다. 이는 래스터라이저(RS)로부터 보간된 UV 좌표를 입력받아, 이 좌표에 해당하는 텍스처(Texture)의 픽셀 값(이하 텍셀, Texel)을 어떻게 읽을지 결정하는 과정이다.
단순히 픽셀 값을 '읽는' 것을 넘어, 텍스처를 어떻게(How) 읽을지 결정하는 복잡한 규칙들의 집합이다.
2. 텍스처 샘플링의 3대 구성 요소

텍스처 샘플링이 일어나기 위해서는 반드시 3가지 요소가 필요하다.
- 텍스처 (Texture):
- GPU 메모리에 로드된 이미지 데이터의 원본이다. (예: 알베도/디퓨즈 맵, 노멀 맵, 러프니스 맵 등)
- Texture Coordinates: 모델링 단계에서, 텍스처링을 위해 폴리곤 메시의 각 정점에 텍스처 좌표를 할당한다. 일반적으로 텍스처 좌표를 (0, 1)로 정규화한다. 따라서 텍스처 좌표는 특정 텍스처 해상도에 의존하지 않고 다양한 텍스처에 적용된다.
- UV 좌표 (Coordinates):
- 래스터라이저(RS)가 픽셀마다 보간하여 PS에게 전달해주는 '주소' 값이다.
- 보통 2차원(U, V)이며, 0.0에서 1.0 사이의 정규화된 값을 가진다.
- 샘플러 상태 (Sampler State):
- 텍스처를 '어떻게' 읽을지에 대한 "규칙의 집합"이다.
- 개발자가 미리 설정하며, 픽셀 셰이더는 이 규칙서(샘플러)를 참조하여 텍스처를 조회한다.
- "돋보기로 볼 때, 경계선은 부드럽게 처리할지(필터링), 지도 밖을 벗어나면 어떻게 할지(주소 모드)" 등을 정의한다.
3. 샘플러 상태(Sampler State)의 상세 기능
샘플러 상태(Sampler State)는 픽셀 셰이더가 텍스처(Texture)를 '샘플링'(읽어올) 때 사용해야 할 규칙의 집합이다.
이것은 텍스처 데이터와는 별개의 설정 객체(Configuration Object)이다.
픽셀 셰이더는 Sample() 함수를 호출할 때, (1) 텍스처와 (2) 샘플러 상태를 함께 GPU에게 절단한다.
3.1. 주소 지정 모드 (Address Mode)
UV 좌표가 0.0 ~ 1.0의 기본 범위를 벗어났을 때 어떻게 처리할지 결정하는 규칙이다.

- Wrap (반복):
- 좌표의 정수 부분을 버리고 소수 부분만 사용한다. (예: U=2.5 -> 0.5)
- 결과: 텍스처가 바닥 타일처럼 무한히 반복된다.
- Clamp (고정):
- 좌표가 1.0을 넘으면 1.0으로, 0.0보다 작으면 0.0으로 고정한다.
- 결과: 텍스처의 가장자리 픽셀 색상이 밖으로 무한히 늘어난다. (캐릭터 스킨처럼 반복되면 안 되는 텍스처에 사용)
- Mirror (거울):
- 텍스처가 거울에 반사되듯이 반복된다. (예: 1.2 -> 0.8, 2.2 -> 0.2)
- Border (테두리):
- 범위를 벗어난 모든 좌표에 대해 개발자가 지정한 단일 테두리 색상(예: 투명 검정)을 반환한다.
3.2 필터링 (Filtering)
RS는 화면의 각 (x, y)위치에 있는 픽셀에 대해, 텍스처 UV 좌표 (s, t)를 보간하여 새로운 UV 좌표 (s′, t′)를 계산한다.
필터링이란 UV 좌표가 텍셀의 정확한 중심이 아닌, 텍셀과 텍셀 '사이'에 위치할 때 어떤 색상을 반환할지 결정하는 규칙이다.
- Magnification
- 화면 공간의 쿼드(2D 화면에 투영된 2D 픽셀 영역)가 이미지 텍스처보다 크게 보일 수 있으며, 따라서 텍스처가 쿼드에 맞도록 확대된다.
- 이 경우, 픽셀 수가 텍셀 수보다 많아진다.
- Minification
- 반대로, 화면 공간의 쿼드가 이미지 텍스처보다 작게 보일 수 있으며, 텍스처가 축소된다.
- 텍스처 공간에 드물게 투영되며, 픽셀은 공간에서 large jump를 한다.
- 이 경우, 픽셀 수가 텍셀 수보다 적다.
3.2.1 Filtering for Magnification

- 옵션 1:Nearest Point Sampling
- UV 좌표에서 가장 가까운 텍셀 1개의 색상을 그대로 반환.
- 인접한 픽셀 블록이 하나의 텍셀에서 다음 텍셀로 급격하게 변화할 수 있으며, 종종 블록화된 이미지(blocky image)가 나타난다.

- 옵션 2: Bilinear Interpolation
- 가장 보편적인 방식이다.
- UV 좌표를 둘러싼 가장 가까운 텍셀 4개(2x2)를 찾는다.
- 이 4개의 텍셀 색상을 UV 좌표와의 거리에 따라 가중 평균(선형 보간)하여 부드러운 중간 값을 반환한다.
- 결과: 텍스처가 확대/축소될 때 경계선이 부드럽게 처리되어 자연스럽다.
- 그래픽 하드웨어는 보통 바이리니어 인터폴레이션에 최적화되어 있다 (?).

3.2.2 Filtering for Minification
Aliasing in Minification

축소의 경우, 픽셀들이 텍스처 공간에 드물게 투영된다.
위 사진의 좌측처럼 모든 픽셀이 어두운 회색 텍셀로 둘러싸여 있다면, textured quad는 어두워 보인다.
우측처럼 모든 픽셀이 밝은 회색 텍셀로 둘러싸여 있다면, textured quad는 밝은 회색으로 보인다.
즉 Aliasing은 고해상도 텍스처를 화면의 작은 영역에 표시(축소/Minification)하려할 때 발생하는 시각적 결함이다.
픽셀 1개가 너무많은 텍셀을 대표하려 할 때 나타나는 문제이다.
이러한 샘플링 오류는 다음과 같은 두 가지 주요 증상으로 나타난다.
- 1. 자글거림 (Shimmering): 물체나 카메라가 아주 조금만 움직여도, 텍스처 표면이 자글거리거나 반짝이는 현상입니다. 멀리 있는 바닥 타일이나 철조망이 프레임마다 다르게 보이는 것이 대표적.
- 2. 모아레 현상 (Moiré Pattern): 텍스처의 규칙적인 패턴(예: 벽돌, 격자무늬)이 화면의 픽셀 그리드와 간섭하여, 존재하지 않는 물결무늬나 무지갯빛 패턴이 나타나는 현상.
3.2. 밉맵핑 (Mipmapping)

물체가 카메라에서 멀어질 때(텍스처가 축소될 때) 발생하는 문제를 해결하기 위한 규칙이다.
- 해결책 (밉맵):
- 원본 텍스처(Level 0)를 로드할 때, ^l x 2^l 해상도의 원본 텍스처를 주어진다면, (l + 1) 레벨의 피라미드가 생성되며, 원본 텍스처는 레벨 0에 위치한다. (이전에는 2^x로 texture 크기가 고정됐음)
- 미리 생성하는 이유는 기존 텍스처 대비 메모리를 약 1.5배(무한 등비급수) 사용하여 다운 스케일링 연산보다 효율적이기 때문이다.
- 이 저해상도 집합을 밉맵 체인(Mipmap Chain)이라 부른다.
- GPU는 물체의 거리를 계산하여, 현재 픽셀에 가장 적합한 밉 레벨(Mip Level)을 자동으로 선택한다. (예: 가까우면 Level 0, 멀면 Level 5)

Level 1 example
- 픽셀은 화면에서 영역을 커버한다.
- 간단히게, 이 영역을 정사각형 가정하면, 그러면 픽셀의 텍스처 공간으로의 투영은 점이 아니라 (s′,t′) 중심의 영역이다. 이 투영된 영역을 픽셀의 footprint라고 합니다.
- 이 예시에서, 쿼드와 레벨 1 텍스처는 같은 크기이다. 픽셀의 footprint는 레벨 0에서 2×2 텍셀을 커버하지만, 레벨 1에서는 하나의 텍셀을 커버한다.
- 픽셀 footpirnt가 레벨 0 텍스처의 m×m 텍셀을 커버할 때, λ는 log2 (m)으로 설정된다.

Level 2 example
- 이 예시에서, 화면 공간 쿼드와 레벨 2 텍스처는 같은 크기이다. 픽셀의 footprint는 레벨 2 텍스처의 정확히 하나의 텍셀을 커버하며, 이 텍셀이 필터링된다.
- 이 예시와 이전 예시에서, 모든 텍셀이 필터링에 관여하는 것을 볼 수 있다.

- 삼선형 필터링 (Trilinear Filtering):
- 선형 필터링(Bilinear)의 확장판이다.
- GPU가 물체의 거리를 볼 때, Level 5와 Level 6의 중간쯤에 있다고 판단할 수 있다.
- 이때, Level 5에서 Bilinear 샘플링을 1회 수행하고, Level 6에서도 Bilinear 샘플링을 1회 수행한다.
- 마지막으로, 이 두 결과 값을 다시 선형 보간하여 최종 색상을 반환한다.
- 결과: 밉 레벨이 바뀌는 구간(거리)에서도 텍스처가 튀지 않고 매우 부드럽게 전환된다.
4. 픽셀 셰이더(PS)에서의 실제 동작
// HLSL (셰이더 코드 예시)
// 1. 텍스처와 샘플러를 CPU로부터 전달받음
Texture2D t_Albedo : register(t0); // 텍스처 데이터
SamplerState s_Sampler : register(s0); // 샘플러 규칙
// 2. 픽셀 셰이더 메인 함수
float4 main(PS_INPUT input) : SV_Target
{
// 3. RS로부터 보간된 UV 좌표를 가져옴
float2 uv = input.TexCoord;
// 4. 샘플링 실행
// GPU는 이 Sample 함수가 호출될 때,
// s_Sampler에 정의된 모든 규칙(필터링, 밉맵, 주소 모드)을
// 하드웨어 가속으로 자동 적용하여 t_Albedo의 텍셀 값을 조회한다.
float4 albedoColor = t_Albedo.Sample(s_Sampler, uv);
// 5. 최종 색상 반환
return albedoColor;
}
5. 요약
텍스처 샘플링은 래스터라이저가 보간한 UV 좌표를 기반으로, 개발자가 정의한 '샘플러 상태'(필터링, 밉맵, 주소 모드)라는 규칙들을 GPU가 실행하여, 최종 픽셀에 가장 적합하고 높은 품질의 텍스처 색상 값을 계산해내는 과정이다.
'그래픽스' 카테고리의 다른 글
| 08. Pixel Shader - Lighting (0) | 2025.11.04 |
|---|---|
| 08. Pixel Shader - Normal Mapping (0) | 2025.11.04 |
| 07. Rasterizer (0) | 2025.11.04 |
| 06. Geometry Shader (0) | 2025.11.04 |
| 05. Domain Shader (0) | 2025.11.04 |