9.2 텍스처 좌표

법선 벡터와 마찬가지로 삼각형의 정점마다 텍스처 좌표를 지정해주면 보간에 의해 삼각형의 모든 점마다 그에 대응되는 텍스처 좌표가 결정된다.

9.3 텍스처 자료 원본

DDS (DirectDraw Surface format)가 지원하는 기능

1. GPU가 직접 해제할 수 있는 압축 형식

2. 밉맵

3. 텍스처 배열

4. 입방체 맵

5. 입체 텍스처

 

9.4 텍스처 생성 및 활성화

텍스처 자원은 CreateDDSTextureFromFile12 함수로 생성

 

Texture 구조체는 Light과 Material과 달리 텍스처 자원의 포인터와 업로드 힙(자원 생성 시 기본 힙으로 복사하기 위한)의 텍스처 자원 포인터를 가지고 있다.

 

CreateDefaultBuffer 함수를 사용해서 정점 버퍼를 기본 힙에 복사하고 업로드 힙의 임시자원과 기본 힙에 복사된 정점 버퍼 자원을 가리키는 포인터를 MeshGeometry 구조체가 가지는 것과 비슷하게 

CreateDDSTextureFromFile12 함수를 사용해서 텍스처 자원을 기본 힙에 복사하고 Texture 구조체는 업로드 힙의 자원과 텍스처 자원의 포인터를 출력 매개변수로 얻는다.

 

자원을 생성했으면 SRV 서술자 힙과 SRV 서술자 힙을 만든다.

 

텍스처를 파이프라인에 묶기

재질을 상수 버퍼에서 가져오기 때문에 한 번의 그리기에 동일한 재질만 사용할 수 있는 제한된 방식을 사용하지 않고 재질 자료를 텍스처 맵에서 가져오는 방법

 

상수버퍼의 DiffuseAlbedo(분산 반사율)은 그대로 사용할 수 있다. 텍스처에서 얻은 분산 반사율과 곱하여 사용

(텍스처에 색을 입힐 수 있는 방법) (상수 버퍼의 분산 반사율이 (1, 1, 1, 1)이면 그대로)

 

Material 구조체에 사용할 분산광 반사율 텍스처 맵의 색인(SRV 힙에서의)을 저장한다.

 

9.5 필터

밉맵 필터링 설정

점 필터링 (point)

ㄴ 화면의 투영된 기하구조의 해상도에 가장 가까운 밉맵 수준을 사용하는 방식

선형 필터링 (linear)

ㄴ 화면의 투영된 기하구조의 해상도에 가장 가까운 이웃한 두 밉맵 수준을 각각 선형 보간해서 텍스처 색상 하나씩 뽑은 다음에 두 밉맵 수준을 보간하여 최종 색상 결정

비등방 필터링 (anisotropic)

ㄴ 법선 벡터와 카메라의 시선 벡터 사이의 각도가 클 때 발생하는 왜곡 현상이 완화된다.

 

9.6 텍스처 좌표 지정 모드

텍스처 좌표의 정의역 [0, 1] 바깥의 좌표가 주어졌을 때의 처리 방식

1. 순환

2. 테두리 색상

3. 한정

4. 반사

9.7 표본추출기 객체

텍스처 필터링과 좌표 지정 모드를 지정하는 객체

 

표본 추출기를 생성하는 방법

1. 표본 추출기 힙에 표본 추출기 서술자를 설정하고 레지스터 슬롯에 묶어 셰이더로 보내는 방법

2. 정적 표본추출기를 사용 

ㄴ 표본 추출기 배열을 만들어 사용, 표본 추출기 힙을 설정하지 않아도 됨

ㄴ 테두리 색상 설정에 제한이 있음

9.8 셰이더에서 텍스처 표본 추출

하나의 SRV가 Texture2D 객체에 묶인다.

텍스처로부터 한 픽셀의 텍스처 좌표 (u, v)가 주어졌을 때 Sample메서드를 이용해서 그 픽셀에 해당하는 표본을 텍스처로부터 실제로 추출한다.

 

9.10 텍스처 변환

정점 셰이더에서 입력 텍스처 좌표를 변환하는데 쓰이는 상수 버퍼 변수

비례 행렬을 적용하면 텍스처를 타일 방식으로 입힐 수 있다.

텍스처의 간단한 애니메이션을 구현하는데 좋다.

 

gTexTransform 

gMatTransform // 재질에 대해 텍스처 변환을 적용하는 것이 합당한 경우

 

연습문제

2.

level 0 ~ level 4로 5개의 밉맵을 가진 dds파일을 만들었다.

멀리서 바라봤을 때는 가장 작은 레벨의 밉맵으로 면이 채워진다

점 밉맵 필터링을 사용한 경우 정육면체의 오른쪽 면을 기준으로

시점에서 가까운 쪽의 면의 일부분은 가장 가까운 수준의 밉맵이 3레벨 밉맵이고

먼 쪽 면의 일부분은 가까운 밉맵이 4레벨 밉맵이어서 경계가 생긴다.

선형 밉맵 필터링을 사용한 경우 하나의 밉맵을 선택하는 것이 아니라 가까운 두 밉맵의 텍스처 색상을 보간하기 때문에 

두 밉맵이 섞여 보인다.

 

3. 다중 텍스처 적용

두 텍스처의 성분별 곱셈으로 새로운 텍스처를 만들어낸다.
Default.hlsl를 수정하여 텍스처를 하나 더 받도록 한다.
Default.hlsl의 픽셀 셰이더 부분에서 두 텍스처를 성분별로 곱한다.
두 개의 텍스처 파일을 불러와 자원을 만든다.
srv 힙의 크기를 2로 늘리고 각각의 텍스처에 대한 서술자를 만든다.
루트 매개변수로 서술자 테이블을 사용했고 t0, t1레지스터에 담아서 보낸다.

4.

텍스처 좌표는 xy 평면에 존재하므로 z축을 기준으로 회전하는 행렬을 적용한다.

각도 theta를 totalTime()으로 지정했기 때문에 2π초마다 한바퀴를 돈다.

Z축 기준 회전을 할때 x= 0.5, y =0.5 (화염구의 중심)을 기준으로 회전시키고 싶기 때문에 x, y 각각 -0.5 씩 이동변환 시킨후 회전하고, 다시 +0.5씩 이동변환 시켜 제자리로 돌아오게 한다.

연습문제 파일

https://github.com/lemonyun/Directx12_study/tree/main/9/Chapter%209%20Texturing

 

GitHub - lemonyun/Directx12_study: 2022/06/10

2022/06/10. Contribute to lemonyun/Directx12_study development by creating an account on GitHub.

github.com

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

11. 스텐실 적용  (0) 2022.06.22
10. 혼합  (0) 2022.06.22
8. 조명  (0) 2022.06.20
7. Direct3D의 그리기 연산 제2부  (0) 2022.06.17
6. Direct3D의 그리기 연산  (0) 2022.06.16

+ Recent posts