아티스트가 제작한 3D 모델과 2D 텍스처를 전달받으면
프로그래머가 둘을 연결하여 모델에 색상을 입혀야 한다.
이 과정을 텍스처 맵핑이라고 한다.
아래 설명은 DirectX 11 기준이다!
텍스처 맵핑 (Texture Mapping)
텍스쳐 맵핑은 3D 모델에서 UV 좌표를 따라 텍스처 이미지를 픽셀에 매핑하는 기법이다. 보통 모델 데이터의 vertex마다 텍스쳐 좌표(UV)를 가지고 있으며, 래스터화 과정에서 픽셀 단위로 보간되어 Pixel Shader 단계에서 텍스쳐 이미지를 샘플링한다.
UV 좌표
텍스처의 상대적 위치를 0~1로 표현하는 2차원 좌표계로 텍스쳐 크기가 몇 픽셀이든 상관없이 0~1사이의 비율로 위치를 표현한다. DirectX의 UV좌표 (0,0)은 Top-Left이다.

샘플링(Sampling)
텍스쳐 좌표(UV)를 이용해 텍스쳐 이미지에서 색상값을 추출하는 과정이다. UV좌표는 0~1 사이의 값을 가지기 때문에 uv좌표값이 실제 텍스쳐의 어떤 픽셀과 딱 맞아떨어지지 않을 수 있다. 즉, uv좌표는 꼭 정확히 한 픽셀에 대응되지 않는다. 이때 “그 좌표(텍셀)에서 어떤 색을 가져올까?”를 결정하는 것이 바로 샘플링(Sampling)이다.
UV 좌표 → 텍스처 내부 위치 계산 → 해당 위치 색상 추출
Sampler State
샘플링을 하기 위해선 여러 Sampler State 옵션들을 설정해주어야 한다. Sampler State는 uv좌표에 따라 텍셀에서 색을 추출할 때, 어떤 텍셀을 어떻게 보간할지와 uv가 0~1을 넘을 때 어떻게 처리할지를 결정한다.
- 어드레싱 모드 (Addressing Mode / Texture Wrapping)
: 텍스처 좌표(UV)가 0~1 범위를 벗어났을 때 어떻게 처리할지 정하는 옵션- Wrap (Repeat) : 0~1 범위를 벗어난 좌표는 소수 부분만 사용한다. (2.3 → 0.3) 타일링 텍스처에서 주로 사용된다.
- Mirror : 0~1을 반복하되 홀수 구간은 좌우 또는 상하를 반전시킨다. 자연스러운 타일링 패턴에서 주로 사용된다.
- Clamp : 0보다 작거나 1보다 큰 좌표에 대해 가장 가장자리 픽셀 색을 반환한다. 텍스처 엣지 고정 등에 사용된다.
- Border : 0~1 바깥 좌표는 지정된 지정한 BorderColor로 채운다. 스프라이트/ 파티클 투명 영역 처리 등에서 사용된다.
- 필터링 (Filtering)
: 텍스처에서 샘플링할 때, UV 좌표(실수 좌표) ↔ 텍셀 좌표(정수 좌표) 의 차이에서 발생하는 “보간(interpolation) 방식을 지정하는 옵션으로, 샘플링의 핵심이다.- Point (Nearest) : 가장 가까운 텍셀 값 하나만 사용 → 계단 현상, 픽셀 느낌
- Linear (Bilinear) : 주변 4개(상하좌우) 텍셀을 가중 평균내서 보간 → 부드럽지만 흐려질 수 있음.
- Trilinear : 각 mip 레벨에서 bilinear를 적용한 뒤, 두 인접 mip 레벨을 선형 보간(= bilinear + linear between mip levels)
- Anisotropic : 텍스처가 비스듬히 보일 때 (예: 바닥을 멀리서 볼 때) 텍스처의 샘플 영역이 타원 모양이 됨. 이때 타원 축을 따라 더 많은 샘플을 뽑아 보간 → 고품질
- 확대 (Magnification Filter)
: 텍스처를 원래 크기 보다 크게 확대할 때 어떤 필터를 쓸지 결정하는 옵션- Point : 픽셀 단위로 뚝뚝 끊김 (레트로 스타일에 적합)
- Linear : 부드럽게 보간
- 축소 (Minification Filter)
텍스처를 원래 크기 보다 작게 줄일 때 어떤 필터를 쓸지 결정하는 옵션- Point : 멀리 보이는 경우 뭉개짐
- Linear : 부드럽게 축소되지만, 멀리서는 뿌옇게 됨
- Anisotropic : 축소 시에도 디테일 유지, 특히 땅 텍스처에서 중요
- 밉매핑 (MipMapping)
밉패밍 사용 여부를 선택하는 옵션이다.- ON (사용) : GPU가 거리(LOD)에 따라 적절한 밉맵 선택 → 성능 + 품질 개선
- OFF (미사용) : 멀리 있을 때 텍스처 깜빡임/모아레 현상 발생
HLSL에서의 텍스쳐 종류와 좌표계
HLSL에서는 텍스쳐 타입이 다양하게 존재한다. DirectX11을 기준으로 주요 텍스쳐들은 다음과 같다. Pixel Shader에서는 보통 Texture2D와 Texture3D를 많이 사용하며, 3D는 보통 의학용 모델에서 많이 사용하기 때문에 Texture2D를 주로 사용한다고 생각하면 된다.
| HLSL 타입 | 설명 | UV 좌표계 | 지원 텍스처 포맷 |
| Texture1D | 1차원 텍스처 (흔히 색상 그라데이션, Look-Up Table(LUT) 등에 사용) | (u)| (0) = left |
DDS, TGA, PNG, BMP 등 |
| Texture2D | 가장 흔히 쓰는 2차원 텍스처 (Diffuse, Normal Map, Specular Map 등) | (u, v) (0,0) = left top |
DDS, TGA, PNG, BMP 등 |
| Texture3D | 3차원 볼륨 텍스처 (의학 영상, Voxel 데이터) | (u, v, w) | DDS |
| TextureCube | 큐브맵 (환경맵, Skybox, Reflection, Refraction 등) | (x, y, z) 방향벡터 | DDS |
DDS(DirectDrawSurface) 포맷
DDS는 DirectX 전용 텍스처 파일 포멧으로 MipMap + 압축 + 다양한 텍스처 타입을 지원해서 게임 엔진/DirectX에서 가장 많이 사용한다.
- DDS 특징
- MipMap 포함 가능 → LOD 연산에 바로 사용
- 압축 지원 → VRAM 절약, 대규모 환경맵 가능
- CubeMap, Volume Texture 가능 → 별도 합성 필요 없음
- DirectX와 호환 → GPU에서 바로 샘플링 가능
DirectX 11 에서의 텍스처 맵핑
DirectX에서 텍스처를 로드하고 맵핑하려면 텍스처를 감싸는 객체와, 샘플링 옵션을 지정하는 객체가 필요하다.
// CPU --------------------------------------------------------------
ID3D11ShaderResourceView* textureRV = nullptr; // 텍스처 리소스 뷰 객체
ID3D11SamplerState* samplerState = nullptr; // SamplerState 옵션 지정 객체
// PS - texture load
HR_T(CreateDDSTextureFromFile(D3DBase::device.Get(), L"../Resource/seafloor.dds", nullptr, &textureRV));
// PS - smapler state create
D3D11_SAMPLER_DESC sample_Desc = {};
sample_Desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; // 상하좌우 텍셀 보간
sample_Desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; // 0~1 범위를 벗어난 uv는 소수 부분만 사용
sample_Desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sample_Desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sample_Desc.ComparisonFunc = D3D11_COMPARISON_NEVER;
sample_Desc.MinLOD = 0;
sample_Desc.MaxLOD = D3D11_FLOAT32_MAX;
HR_T(D3DBase::device->CreateSamplerState(&sample_Desc, &samplerLinear));
// 매 프레임 update!
D3DBase::deviceContext->PSSetShaderResources(0, 1, &textureRV);
D3DBase::deviceContext->PSSetSamplers(0, 1, &samplerState);
// GPU --------------------------------------------------------------
// Texture 슬롯 연결
Texture2D txColorMap : register(t0);
// SamplerState 슬롯 연결
SamplerState samLinear : register(s0);
// Pixel Shader
float4 main(PS_INPUT input) : SV_TARGET
{
// 생성한 두 객체를 통해 샘플링하여 색상을 반환한다.
return txColorMap.Sample(samLinear, input.texCoord);
}
'Programming > 컴퓨터그래픽스 (DX 11)' 카테고리의 다른 글
| [Lighting] 퐁 쉐이딩(Phong Shading)과 블린퐁 쉐이딩(Blinn-Phong Shading (0) | 2025.10.10 |
|---|---|
| [DirectX 11] 깊이 테스트(Depth Testing, Z-Test)와 DepthStencilView (0) | 2025.09.23 |
| Texel, UV, Pixel (1) | 2025.09.17 |
| MipMapping과 LOD(Level of Detail) (0) | 2025.09.17 |
| [DirectX 11] 상수버퍼(Constant Buffer) CPU 구조체와 HLSL 구조체 정렬 맞추기 (0) | 2025.09.16 |