※ 아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.
1. 나무 상자 예제의 텍스처 좌표들과 좌표 지정 모드, 필터링 옵션들을 여러가지로 변경하면서 실험해볼것
- Basic.fx에서 필터링 옵션 및 텍스처 좌표 지정 모드를 변경해가면서 테스트 해본다.
- 확대했을 때, 점 필터링이 확연하게 덩어리지는 것을 알 수 있다.
- 비등방 필터링과 선형 필터링은 여기선 큰 차이를 느끼기 힘드므로 아래 사진을 보자.
※ 위의 예제에서 텍스처 좌표 지정 모드는 모두 순환 모드이다.
- 사진 상으론 제대로 나타나지 않지만, 비등방 필터링이 윗면이 좀 더 선명하게 나오고 있다.
- 텍스처 좌표를 5배로 비례해서 텍스처 좌표 성분들이 [0, 5] 구간이 되게 하여 텍스처가 벽에 5 x 5 패턴으로 반복되게 만들었다.(텍스처 좌표 지정 모드 WRAP 기준 반복되는 패턴)
- 텍스처 좌표를 (-0.5, -0.5)만큼 이동시켜서 실제 텍스처 좌표 성분들이 우하단 방향으로 내려가도록 만들었다.
=> 텍스처 좌표 성분을 제외한 벽에는 텍스처 좌표 지정 모드에 따라 채워진다.
2. 밉맵 수준들의 이미지 내 문구나 색상이 모두 다른 밉맵 사슬을 가진 DDS 파일을 생성해서 입방체에 적용하라.
- cpp 파일에서, 프로젝트 폴더에 주어진 "mipmaps.dds" 파일을 적용하면 된다.
- Basic.fx 파일에서 필터링 모드만 변경하면 아래처럼 점, 선형, 비등방 필터링 테스트가 가능하다.
=> 1번에서 이미 해봤던 부분이기 때문에 코드는 별도로 첨부하지 않음
- 각 필터링에 따라서, 얼마나 축소가 돼야 밉맵 수준이 달라지는지도 전부 달랐음.
=> 당연히 점 필터링 -> 선형 필터링 -> 비등방 필터링 순서로 거리가 더 멀어져야 밉맵 수준이 달라졌음.
3. 프로젝트 폴더에 주어진 2개의 .dds 파일을 성분별로 곱해서 다중 텍스처를 적용해보라.
- 두 개의 .dds 파일을 불러와서 성분별로 곱해야 하므로, Basic.fx 파일에 2개의 텍스처 변수를 선언하고 Effects.h/.cpp 파일에서 Basic.fx 파일에 선언한 2개의 변수에 접근할 수 있는 변수를 마찬가지로 선언 후 할당해준다.
- 마찬가지로 두 개의 .dds파일 각각에 대한 셰이더 자원 뷰를 만들고, 해당 뷰의 내용을 Basic.fx에서 선언한 2개의 변수에 넘겨준다.
- 픽셀 셰이더에서 2개의 텍스처에서 각각 텍스처 좌표를 기반으로 표본을 추출하고, 해당 추출된 표본들을 곱하면 원하는 답이 나온다.
=> 밑의 결과 사진은 곱셈 말고도 사칙연산을 모두 적용해본 결과임
4. 연습문제 3을 이어서, 불덩이 텍스처를 시간의 함수로서 회전해서 각 면에 입히도록 수정하라
- 3번에서 했던 코드에 시간의 함수로 돌리기 위해 받아올 실수 변수 하나가 Basic.fx 파일에 추가되었다.
=> 당연히 Effects.h/.cpp 파일에도 추가 코드가 필요하다.
- rotation_texture 함수를 통해서 텍스처를 회전시킨다.
- 회전의 중심이 텍스처의 좌상단 모서리여서 그냥 회전하게 되면 텍스처가 좌상단을 중심으로 회전하게 된다.
따라서, 현재 텍스처의 좌상단 모서리를 면의 중심으로 옮기기 위해 텍스처 좌표를 (-0.5f, -0.5f) 방향으로 이동한다.
그 상태로 텍스처 좌표에 회전 변환 행렬을 적용시킨 후, 다시 텍스처 좌표를 (0.5f, 0.5f) 방향으로 이동하면 텍스처가 중심을 축으로 회전하는 것처럼 보이게 된다.
=> 텍스처 좌표 이동이 헷갈릴 수 있다. 텍스처가 아닌 텍스처 좌표의 이동임을 유의하면서 생각해보자.
- 이후, 각각의 텍스처 좌표를 이용해서 각각의 텍스처에 표본 추출을 하고 결과를 곱해주면 된다.
- Cpp 파일에서 .dds 파일 2개에 대한 셰이더 자원 뷰, 회전 변환 행렬에 적용할 값을 모두 구해서 효과 파일의 변수에 할당해준다.
5. 불 애니메이션 프레임 이미지 120장이 입방체의 각 면에서 재생되도록 나무 상자 예제를 수정하라.
- 이미지 개수(mMaxImageFrame), 애니메이션 재생 시간(mAnimPlayTime), 애니메이션 프레임(mAnimFrameTime)
- 실제 재생된 프레임 시간(mFrame), 현재 재생중인 애니메이션 이미지(mAnimCount)
- 전체 파일 이름(mFileName), 파일 뒷부분의 숫자 문자열(mFileNum), 파일의 확장자(mFileExtension)
- 전체 120장의 이미지가 4초동안 재생되어야 하므로 애니메이션 프레임은 4/120 = 0.03333.... 이다.
- 애니메이션 재생 전에 우선 첫번째 이미지를 미리 적용시켜둔다.
- 파일 이름이 Fire001.dds ~ File120.dds 이므로 문자열 함수를 이용해서 뒤의 숫자만 1씩 증가시켜주면 120장의 이미지를 일정 시간마다 한장씩 로드하여 애니메이션 효과를 낼 수 있다.
=> 우선 mFileName 변수에 파일 경로부터 파일 명의 Fire 까지만 저장해둔다.
=> mAnimCount 값을 1 증가시키고 문자열로 변환한 값을 mFileNum에 저장한다.
=> mAnimCount 가 10보다 작으면 mFileName에 "00"을, 100보다 작으면 "0"을 먼저 넣어준 다음, mFileName에 mFileNum의 내용을 이어붙인다.
=> 마지막으로 mFileName에 mFileExtension을 붙이면 전체 파일 이름이 만들어진다.
- 해당 함수를 UpdateScene()에서 호출하며, dt값을 인자로 넘겨준다.
=> mFrame을 dt값을 이용해 증가시키며 애니메이션 프레임보다 mFrame 값이 커지면 다음 사진을 로드하고 mFrame값을 0으로 변경한다.
- 120장의 이미지를 모두 재생한 후에는 다시 첫 번째 이미지로 되돌아간다.
※ 문제에서는 텍스처 객체 120개의 배열에 이미지를 모두 적재하라고 했지만, 주어진 이미지가 .bmp 파일이어서 해당 방법을 위한 함수를 찾지 못함. 외부 라이브러리를 링킹해서 사용해야 한다는 내용을 봤지만, 임의로 .bmp 파일을 .dds 파일로 변경하여 해결하기로 함. => 문제의 취지와는 벗어난 방법으로 해결함
※ 이런식으로 이미지를 넘기는 방식으로 애니메이션을 만드는 것을 페이지 넘기기(page flipping)라고 부른다. 이런 식으로 프레임마다 개별적인 텍스처를 두어서 애니메이션을 수행하는 것은 비효율적이다. 모든 프레임을 하나의 커다란 텍스처 대지도에 몰아넣고 매 1/30초마다 애니메이션의 다음 프레임이 적용되도록 텍스처 좌표를 이동하는 것이 낫다.
연습문제의 목적에서는 효율성이 큰 문제가 되지 않으므로 페이지 넘기기 기법을 사용하면 된다.
7. 7장의 조명된 두개골 예제(LitSkull)의 지면, 기둥, 구에 텍스처를 입혀보라.
- 기존 LitSkull의 Effect, Vertex, Basic 코드에는 텍스처 관련 코드가 없었으므로 추가해준다.
=> 8장의 vertex, effect 코드 그대로 가져다 써도 상관없음.
- cpp 파일에서 각 텍스처별 셰이더 자원 뷰를 3개 만들어서 파일을 불러와 할당해준다.
- 정점 버퍼 생성 함수에서 각 도형별 텍스처 성분도 정점 버퍼에 함께 넣어준다.
- DrawScene() 함수의 효과 기법에서 각 도형별로 텍스처를 설정해준다.
=> 여기선 grid에 대한 부분만 캡처했다. 똑같은 내용이므로 각 도형별로 어렵지 않게 추가할 수 있을 것이다.
- LitSkull은 숫자 버튼을 누르면 조명 개수가 조절되도록 코드가 되어있었으므로 해당 부분도 신경써줘야 한다.
=> 특히, 해골의 경우엔 텍스처 좌표가 없어 텍스처를 입힐 수 없으므로 효과기법 객체를 2개 선언해서 도형과 해골 각각 적용해주어야 한다.
※ cpp 파일에서 멤버 변수로 COM 객체들을 할당했다면 소멸자에서 ReleaseCOM 함수를 이용해 할당을 해제해주는 것을 잊지말자.
개인적으로 이해한 내용을 바탕으로 작성하였기 때문에 틀린 내용이 있을 수 있습니다. 참고하실 때 주의 해주세요.
틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요.
감사합니다!
'DirectX11 > 코드정리' 카테고리의 다른 글
[DirectX11] 10장 스텐실 적용 연습문제 (1) | 2023.01.18 |
---|---|
[DirectX11] 9장 혼합 연습문제 (0) | 2023.01.05 |
[DirectX11] 텍스처 예제 (0) | 2022.11.29 |
[DirectX11] 7장 연습문제 (0) | 2022.11.25 |
[DirectX11] 조명 예제 (0) | 2022.11.25 |
댓글