※ 아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.
1. 정점 구조체를 위한 D3D11_INPUT_ELEMENT_DESC 배열을 작성하라
2. 상자 예제를 정점 버퍼 두 개를 사용하도록 수정하라.
- 위치 성분을 담은 구조체, 색상 성분을 담은 구조체를 각각 정의한다.
- 위치 성분, 색상 성분을 담을 정점 버퍼 2개를 멤버 변수로 선언한다.
- 정점 버퍼를 두 개 사용할 것이므로 입력 배치 서술 배열은 위와 같다.
- 위치 성분의 입력 슬롯은 0, 색상 성분의 입력 슬롯은 1에 연결된다.
- 위치와 색상 성분을 각각의 정점 버퍼에 저장한다.
- 각각의 정점 버퍼를 장치 문맥에 모두 묶어준다.
- 이후 과정은 기존 코드와 같다.
3. 기본 도형을 그리는 응용 프로그램을 작성하라
- 점 목록
- 생성할 점을 각 위치별로 정의한다. 색상은 임의의 색상을 선택했다.
- 점 목록을 그릴 것이므로 기본도형 위상구조를 설정하는 함수의 인자 값을 그에 맞게 설정해준다.
- 선 띠
- 점 목록을 생성하는 코드와 거의 일치한다.
- 색인의 순서에 따라 선이 연결되므로, 원하는 선 모양이 그려지도록 색인 순서를 조절해주기만 하면 된다.
- 선 목록
- 삼각형 띠
- 삼각형 목록
- 정점 감기 순서
- 정점 감기 순서를 지켜주어야 하는 것은 삼각형 목록 뿐이었음.
- 나머지는 그냥 색인을 순서대로 나열하기만 해도 원하는 그림이 나옴.
=> 자세한 설명은 주석을 사용해서 코드에 각 케이스별로 작성해둠.
4. 피라미드(사각뿔)를 그려라. 밑면은 녹색, 뾰족한 꼭대기는 빨간색으로 설정할 것.
- 사각뿔의 밑면의 정점과 꼭대기의 정점의 위치 및 색상 성분을 정의한다.
- 기본도형 위상구조를 삼각형 목록으로 설정하였으므로 해당 정점에 맞춰 정점 감기 순서를 지켜 색인을 생성한다.
5. 색상은 정점들에만 저장되어 있는데, 삼각형 면의 픽셀들이 색이 입혀져서 보간되는 이유는 무엇인가?
- 래스터화기 단계에서 뷰포트 변환, 후면 선별 등의 과정을 거친 후에는 정점의 특성들을 삼각형을 덮는 각 픽셀에 대해 보간하게 된다.
- 즉, 래스터화기 단계에서 정점 셰이더(or 기하셰이더)가 공급한 정점 특성들을 삼각형의 픽셀들을 따라 보간한 결과를 픽셀 셰이더에 입력하고, 픽셀 셰이더는 주어진 입력으로부터 픽셀 단편의 색상을 계산해내는 것이다.
=> 래스터화기 단계에서 정점들에 지정된 색상값을 픽셀 셰이더의 입력으로 넘겨주고, 픽셀 쎼이더는 주어진 입력으로부터 픽셀 단편의 색상을 계산해내어, 삼각형을 덮는 각 픽셀에 대해 색상 보간이 이루어지게 되는 것이다.
- 참고로, 정점 특성들 뿐만 아니라 정점의 깊이값도 그런식으로 보간해야 한다.
6. 상자 예제를, 상자가 시간의 함수로써 애니메이션 되도록 수정하라.
- 효과 파일의 상수 버퍼에 프로그램 실행 시간을 담을 변수를 하나 선언한다.
- 정점 셰이더에 시간에 따른 정점들의 이동을 맡아줄 코드를 추가한다.
- BuildFX() 함수에서 효과 파일 상수 버퍼에 새로 선언한 gTime 변수의 포인터를 얻어온다.
- 이후 DrawScene() 함수에서 gTime에 GameTimer::TotalTime() 의 값을 대입한다.
- 효과 기법들에 대한 각 패스를 적용하고 그림을 그리면, 애니메이션이 적용된다.
7. 상자 예제에 피라미드를 하나 추가하라. 단, 하나의 커다란 정점 버퍼와 색인 버퍼만 이용할 것.
- 상자와 피라미드의 세계 변환 행렬을 각각 정의한다.
=> 두 도형이 같은 위치에 겹쳐서 나오면 안 되기 때문에 상자와 피라미드의 위치를 적절히 이동한 세계 변환 행렬을 정의한다.
- 상자와 피라미드 각각의 정점 및 색인을 정의하고 각 도형 별 정점 오프셋, 색인 개수, 색인의 시작 지점을 구한다.
- 이후 하나의 배열에 각 도형의 정점을 모두 대입하고, 해당 배열을 이용해서 정점 버퍼를 생성한다.
- 정점과 마찬가지로 하나의 배열에 각 도형의 색인을 모두 대입하고, 해당 배열을 이용해서 색인 버퍼를 생성한다.
- 각 도형 별로 세계ㆍ시야ㆍ투영 결합 행렬을 적용해서 그림을 그려준다.
- DrawIndexed의 인자를 적절히 넘겨주어야 한다.
- Shapes 예제와 거의 같은 방식의 로직을 따라가므로 참고하면 쉽게 해결이 가능할 것.
개인적으로 이해한 내용을 바탕으로 작성하였기 때문에 틀린 내용이 있을 수 있습니다. 참고하실 때 주의 해주세요.
틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요.
감사합니다!
'DirectX11 > 코드정리' 카테고리의 다른 글
[DirectX11] 조명 예제 (0) | 2022.11.25 |
---|---|
[Directx11] 6장 연습문제(2) (0) | 2022.11.22 |
[DirectX11] Skull, Waves 예제 (0) | 2022.11.17 |
[DirectX11] Shapes 예제 (0) | 2022.11.17 |
[DirectX11] Hills 예제 (0) | 2022.11.17 |
댓글