서의 공간

제8장 텍스처 적용 본문

Graphics API/DirectX 11 - Luna

제8장 텍스처 적용

홍서의 2020. 12. 22. 22:37

목표

1. 텍스처 이미지의 한 부분을 지정해서 삼각형에 입히는 방법을 배운다.

2. 텍스처를 생성하고 텍스처 매핑을 활성화하는 방법을 파악한다.

3. 텍스처를 필터링해서 더 매끄러운 모습을 만들어 내는 방법을 배운다.

4. 주소 지정 모드를 조정함으로써 하나의 텍스처가 타일처럼 여러 번 적용되게 하는 방법을 알아본다.

5. 여러 장의 텍스처를 조합해서 새로운 텍스처를 만들고 특수효과를 구현하는 방법을 파악한다.

6. 텍스처 애니메이션으로 기본적인 효과 몇 가지를 만들어 내는 방법을 배운다.

8.1 텍스처와 자원의 개괄

후면 버퍼와 깊이 버퍼는 ID3D11Texture2D 인터페이스로 대표되는 2차원 텍스처 자원이다.

텍스처 자원은 파이프라인의 단계에 직접 묶이지 않고, 텍스처가 연관된 자원 뷰를 파이프라인 단계에 묶는다. 흔한 예로 텍스처를 렌더 타겟으로 바인딩 하는 것과 텍스처를 셰이더 자원으로 바인딩 하는것이 있다. 텍스처를 생성할 때의 bind flag는 연관된 자원 뷰에 맞게 설정한다. D3D11_BIND_RENDER_TARGET이라면 ID3D11RenderTargetView를 사용하고, D3D11_BIND_SHADER_RESOURCE라면 ID3D11ShaderResourceView를 사용한다.

8.2 텍스처 좌표

텍스처 좌표 \((u, v)\)로 식별되는 텍스처의 한 요소를 텍셀(texel; texture element)라고 부른다.

\(\mathbf{p_0}, \mathbf{p_1}, \mathbf{p_2}\)가 한 3차원 삼각형의 정점들이고 \(\mathbf{q_0},\mathbf{q_1},\mathbf{q_2}\)가 그에 해당하는 텍스처 좌표들이라고 하자. 3차원 삼각형의 임의의 점 \((x, y, z)\)에 대한 텍스처 좌표 \((u, v)\)는 삼각형 정점들에 지정된 텍스처 좌표들을 삼각형 면을 따라 보간해서 구하는데, 이 보간에는 삼각형 정점의 보간에 쓰이는 것과 동일한 \(s,\ t\)매개변수가 적용된다. 즉, \(s\ge0,t\ge0,s+t\le1\)이라 할 때 만일

\[(x, y, z) = \mathbf{p} = \mathbf{p_0}+s(\mathbf{p_1}-\mathbf{p_0})+t(\mathbf{p_2}-\mathbf{p_0})\]

이면

\[(u, v)=\mathbf{q} = \mathbf{q_0}+s(\mathbf{q_1}-\mathbf{q_0})+t(\mathbf{q_2}-\mathbf{q_0})\]

이다. 이런 보간에 의해, 삼각형의 모든 점마다 그에 대응되는 텍스처 좌표가 결정된다. 아래 그림을 참조할 것.

[그림 8.1] 왼쪽은 3차원 공간의 한 삼각형이고 그 3차원 삼각형에 입혀질 텍스처상의 2차원 삼각형을 정의한 것이다.

8.3 텍스처 생성 및 활성화

일반적으로 텍스처 자료는 디스크에 저장된 이미지 파일에서 읽어서 ID3D11Texture2D 객체에 적재한다. 그런데 텍스처 자원이 렌더링 파이프라인에 직접 묶이는 것은 아니다. 대신 텍스처에 대한 셰이더 자원 뷰(ID3D11ShaderResourceView)를 생성하고 그 뷰를 파이프라인에 묶어야 한다.

hlsl에서 2차원 텍스처 객체를 나타내는 형식은 Texture2D이다.

8.4 필터

통상적인 텍스처 매핑에서 텍셀, 즉 텍스처 맵의 요소들은 하나의 연속된 이미지로부터 추출하는 이산적인 색상 표본(sample)이라 할 수 있다. 텍셀을 면적을 가진 하나의 직사각형이라고 생각하는 것은 바람직하지 않다.

각 픽셀에는 정점 텍스처 좌표를 삼각형을 따라 보간해서 결정된 고유한 텍스처 좌표가 부여되어 있다. 따라서 확대나 축소가 일어날 때 텍셀 점과 정확히 일치하지 않는 텍스처 좌표를 가진 픽셀들이 존재하게 된다. 그런 픽셀들의 색을 결정하는 한 가지 방법은 픽셀 부근에 있는 텍셀들의 색들을 보간하는 것이다. 이를 위해 그래픽 하드웨어는 두 종류의 보간 방법을 지원하는데, 하나는 상수 보간이고 또 하나는 선형 보간이다. 실제 응용에서는 거의 항상 선형 보간이 쓰인다.

2차원 텍스처에서는 겹선형 보간(bilinear interpolation)이라는 선형 보간 기법을 사용한다. 그림 8.2에서 보듯이, 겹선형 보간에서는 네 텍셀 사이의 한 지점을 가리키는 텍스처 좌표가 주어졌을 때 u 방향으로 1차원 선형 보간을 수행하고 v 방향으로 1차원 선형 보간을 수행해서 최종 결과를 얻는다.

[그림 8.2] 

축소에 대해서 필터링 이외의 처리가 가능하다. 평균 하향표본화(downsampling)를 통해 기존 텍스처를 더 작은 맵으로 줄일 수 있다. 이 것을 이용해서 축소를 효율적으로(대신 메모리를 조금 더 사용하지만) 근사하는 기법이 바로 밉매핑(mipmapping)이다. 밉매핑에서는 텍스처 초기화 시점(또는 생성 시점)에서 주어진 이미지를 하향표본화해서 텍스처의 더 작은 버전들을 만든다. 그런 버전들을 밉맵 수준(mipmap level)들이라고 부르며, 그러한 밉맵 수준들이 하나의 밉맵 사슬(mipmap chain)을 형성한다.

이후 렌더링 도중에 텍스처를 적용할 때 그래픽 하드웨어는 응용 프로그램이 제공한 밉맵 설정에 기초해서 다음 두 방식 중 하나를 적용한다.

1. 화면에 투영된 기하구조의 해상도에 가장 잘 부합하는 하나의 밉맵 수준을 선택해서 텍스처로 사용한다. 이때 필요하다면 상수 보간이나 선형 보간이 적용된다. 이처럼 가장 가까운 밉맵 수준을 사용하는 방식을 밉맵의 점 필터링이라고 부르는데, 텍스처 적용시 상수 보간을 통해서 가장 가까운 텍셀 값을 선택하는 점 필터링과 비슷한 방식이기 때문이다.

2. 화면에 투영된 기하구조의 해상도에 가장 잘 부합하는 이웃한 두 밉맵 수준(하나는 화면 기하구조 해상도보다 큰 것, 다른 하나는 더 작은 것)을 선택한다. 그런 다음 그 두 밉맵 수준에 대해 상수 필터링이나 선형 필터링을 적용해서 두 개의 표본(텍스처 색상)을 뽑는다. 마지막으로 그 두 표본을 보간해서 최종 색상을 결정한다. 이처럼 가장 가까운 두 밉맵 수준을 선형 보간하는 방식을 밉맵의 선형 필터링이라고 부르는데, 텍스처 적용 시 가장 가까운 두 텍셀 값을 보간하는 선형 필터링과 비슷한 방식이기 때문이다.

비등방 필터링(anisotropic filtering)은 다각형읜 법선 벡터와 카메라의 시선 벡터 사이의 각도가 클 때(이를테면 다각형이 시야 창과 수직에 가까울 때) 발생하는 왜곡 현상을 완화한다.

8.5 텍스처 표본 추출

hlsl에서 Texture2D는 2차원 텍스처를 대표한다. SamplerState객체는 텍스처에 적용할 필터링에 대한 설정을 담는다. 2차원 텍스처를 추출할 때는 Texture2D::Sample 메서드를 사용한다. 아래 코드를 참조한다.

SamplerState samAnisotropic
{
	Filter = ANISOTROPIC;
    MaxAnisotropy = 4;
};

float4 PS(VertexOut pin, uniform int gLightCount) : SV_Target
{
	float4 texColor = gDiffuseMap.Sample(samAnisotropic, pin.Tex);
    ...
    

8.6 텍스처 재질

텍스처를 재질/조명 시스템과 통합할 때에는, 텍스처 색상을 주변광과 분산광으로 변조(modulation)하되 반영광으로는 변조하지 않도록 하는 것이 일반적이다(그런 방식을 흔히 '변조 후 가산[modulate with late add]'이라고 부른다).

// 변조 후 가산
litColor = texColor * (ambient + diffuse) + spec;

8.7 나무 상자 예제

8.8 텍스처 좌표 지정 모드

텍스처와 상수 또는 선형 보간의 조합은 하나의 벡터 값 함수 \(T(u, v) = (r, g, b, a)\)를 정의한다. 즉, 텍스처 좌표 \((u,v)\in[0,1]^2\)이 주어졌을 때, 텍스처 함수 \(T\)는 하나의 색상 \((r, g, b, a)\)를 돌려준다. 이 함수의 정의역 바깥의 좌표가 주어졌을 때의 처리 방식을 좌표 지정 모드(address mode)라고 부르는데, Direct3D가 지원하는 좌표 지정 모드는 순환(wrap), 테두리 색(border color), 한정(clamp), 거울(mirror) 네 가지이다.

8.9 텍스처 변환

8.10 텍스처 입힌 언덕과 파도 예제

8.11 압축 텍스처 형식들

'Graphics API > DirectX 11 - Luna' 카테고리의 다른 글

제12장 계산 셰이더  (0) 2020.12.23
제11장 기하 셰이더  (0) 2020.12.23
제10장 스텐실 적용  (0) 2020.12.23
제9장 혼합  (0) 2020.12.23
DirectX 11 그래픽스  (0) 2020.12.07
Comments