Direct3D 12 graphics Pipeline
Rasterizer를 통해 pixel이 생성되고, 일부 값들을 보간해서 채워줬다. 이제 Pixel shader에서는 그 위에 Texturing과 Lighting 작업을 해준다. 이번 포스팅에서는 그 중에서 Texturing에 대해 알아볼 예정이다.

Image Texturing
◇ rasterizer가 보간한 texture 좌표에 texture 해상도를 곱해서 실제 texture에서 rgb값을 꺼내오는 것
- 1) 모델링 단계에서 polygon mesh의 각 정점마다 texture coordination가 설정되어야 한다. (s,t)
- 2) 이후 rasterizer가 각 pixel에 따라 interpolation 해서 넘겨준다.
- 3) texture 좌표 (s,t)에 실제 texture의 해상도를 곱해서 (s', t')를 구한다.
- 4) (s', t') = c의 좌표를 활용해서 실제 texture(c)에서 rgb 값을 가져온다.


- texture coordintate의 s와 t는 0과 1 사이로 nomalize 되어있어 다양한 텍스쳐에 적용될 수 있다.

Surface Parameterization
◇ 복잡한 2D,3D 표면을 단순한 2D 좌표계 (s,t)로 표현하는 방법

Chart and Atlas
◇ 복잡한 polygon mesh는 patch(ex.머리, 몸 , 팔)들로 나누어 관리한다.
- 각 patch들로 나누어 surface parameterization을 수행한다.
- chart : 각 patch들의 이미지
- atlas : 여러 개의 chart들이 texture에 합쳐진 것

Texture Wrapping
◇ range를 벗어난 (s,t)들을 처리해주는 방법
- Clamp-to-Edge (c) : 벗어날 경우 edge color로 렌더링한다.
- Repeat (d) : 반복으로 타일링하는 방식
- Mirrored-Repeat (e),(f) : 그냥 Repeat을 하면 경계가 부자연스러울 수 있기 때문에 mirrored 방식을 사용할 수 있다.

Texture Filtering
◇ 텍셀(texel) → 화면 픽셀(pixel)로 맵핑할 때, 해상도 차이를 보정하는 기술
- 텍스처 해상도와 화면 해상도가 다를 경우 생기는 왜곡/노이즈 문제가 발생할 수 있다.
- Magnification (확대) : pixel > texel

- Minification (축소) : pixel < texel

Filtering for Magnification
◇ pixel이 texel보다 많은 경우 = 하나의 texel이 여러 pixel을 표현하게 된다.
- Option 1: Nearest point sampling
- 현재 픽셀에 가장 가까운 텍셀 하나의 값을 그대로 가져온다.
- 가장 간단하지만 같은 texture 값을 여러 번 가져오면서 block image 문제가 발생한다.

- Option 2 : Bilinear interpolation
- 주변 4개의 텍셀 값을 이용해 보간(Interpolation)하여 중간색을 계산
- 수평/수직 방향으로 보간을 2번 해서 최종 c를 구한다.
- 경계가 부드럽고 자연스러운 색 표현이 가능하지만, 연산량이 많은 단점이 있다.

Filtering for Minification
◇ pixel이 texel보다 적은 경우, texel의 숫자를 줄여야 한다! = 확대보다 심각한 문제
- Aliasing 문제
- 어떤 texel을 샘플링하느냐에 따라 결과가 달라지는 aliasing 문제가 발생한다.
- 표현하고자 하는 texture와 전혀 다르게 표현될 수 있는 심각한 문제다!
- 이를 위해 Mipmapping을 활용할 예정

Mipmapping
◇ Aliasing 문제를 해결하기 위한 방법 - down sampling을 통해 minmap을 만들자!
- 목표 : texel의 수를 줄여서 pixel 수에 최대한 가까워지게 할 것
- mipmap : downsampling 한 level-λ texture의 모음
- 원래 텍스처의 해상도가 인 경우, (l+1)개의 레벨로 구성된 피라미드(mipmap)를 구축한다.

- 이때 각 pixel에 맞는 level-λ texture는 각 pixel이 차지하는 texel의 가로 or 세로 개수 m을 log_2(m)으로 표현하면 해당 level이 된다. 즉, λ = log_2(m) 이다.
- 로그 계산이 딱 떨어지면 좋겠지만, 아래 처럼 m=3인 예시에서만 봐도 문제가 발생한다.
- Option 1) 가장 가까운 level 고르기.

Reference KHU 강형엽 교수님 강의를 수강하며 정리한 내용입니다.
'그래픽스' 카테고리의 다른 글
| [DirectX12] 5. Output Merger (1) | 2026.04.10 |
|---|---|
| [DirectX12] 4. Pixel Shader - Lighting (0) | 2026.03.13 |
| [DirectX12] 2. Rasterizer (1) | 2026.03.13 |
| [DirectX12] 1. Input Assembler, Vertex Shader (0) | 2026.03.12 |