ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DirectX 11을 이용한 3D게임 프로그래밍 입문 연습문제 6 - 7
    Graphics/DX11 물방울책 연습문제 풀이 2021. 3. 21. 17:49

    문제

    상자와 피라미드를 같이 배치해라. 단 상자의 정점과 피라미드의 정점을 하나의 정점 버퍼에 넣어야 하며 색인 또한 마찬가지이다. 그리고 서로 도형이 겹치지 않도록 세계 변환 행렬을 적절히 사용하도록 한다.

     

    해결

    편의상 배열에서 벡터로 바꾸었다.

    우선 상자의 정점,색인과 피라미드의 정점, 색인을 정의해야 한다.(색인은 스샷 생략)

     

     

     

     

     

    멤버 변수 m... VertexOffset, IndexCount, Indexoffset을 정의 및 할당했습니다. 이 변수들에 대한 자세한 설명은 나중에 나오는 DrawIndexed함수를 사용할 때 부가하도록 하겠다.

     

     

     

     

     

     

    여기서는 정점의 총 개수와 인덱스의 총 개수를 구합니다. 이는 버퍼를 정의하는 D3 D11_BUFFER_DESC에서 ByteWidth변수에 값을 할당하기 위해 사용되는 변수이다. 구체적으로 vector는 sizeof로 값을 구해도 안에 값이 바뀌더라도 변하지 않기 때문에 sizeof(Vertex) * totalVertexSize로 값을 할당하며 색인 또한 마찬가지다.

     

     

     

     

     

     

    소스가 길다. 바뀐 부분만 짚어보도록 하겠다.

     

    도형이 세계로 나오기위해서는 세계 변환 행렬을 거쳐야 한다.

    세계 변환 행렬은 비례 행렬, 회전 행렬, 이동행렬을 곱한 행렬을 뜻한다. 도형의 최솟점과 최댓점만 알고 있다면 행렬을 통해 계산함으로써 결괏값을 가질 수 있다. 세계 변환 행렬을 거치게 되면 비례 회전 이동을 한 번에 계산할 수 있다.

     

    피라미드를 영점에 배치하게 되면 상자와 겹치기 때문에 오른쪽으로 3만큼 이동시키도록 하겠다. 이동행렬을 반환해주는 XMMatrixTranslation 함수를 통해 피라미드의 이동을 정의해주고 그 결괏값을 저장한다. 우선 상자를 먼저 배치하기 위해 예제 소스대로 worldViewProj변수를 상수 버퍼에 넣어준다. 하지만 실제로 버퍼 값이 경신되는 건 아니고 효과 객체의 내부 캐시가 갱신된 것뿐이다. 버퍼 값을 경신하려면 Apply메서드를 호출해야 한다.

     

    그다음 DrawIndexed메서드를 통해 화면에 그림을 그린다.

    첫 번째 매개변수는 IndexCount로 현재 그리고자 하는 도형의 색인 개수가 들어갑니다. 상자는 36개이므로 36이 들어가며 사각뿔은 18개이다.

    두 번째 매개변수는 StartIndexLocation으로 시작 인덱스를 담는 매개변수입니다. 앞서 하나의 버퍼에 상자와 사각뿔의 색인정보를 담았다. 상자의 색인은 36개이므로 0번째부터 35번째까지는 상자의 색인정보이다. 하지만 36번째부터 사각뿔의 색인이므로 사각뿔을 그릴때 시작인덱스를 정해주는 거다.

    세 번째 매개변수는 BaseVertexLocation입니다. 두 번째 매개변수와 비슷한 역할로 이번엔 색인이 아닌 정점의 시작 인덱스를 담는 매개변수이다.

     

     

     

     

     

     

    결과 화면

Designed by Tistory.