[c#] directX 연동 및 툴 만들기 - 3
[c#] directX 연동 및 툴 만들기 - 3
: 버텍스, 인덱스로 맵 만들기
안녕하세요.
게임에서 3d객체나 맵을 만들때는 삼각형으로 만드는데요.
맵은 삼각형 2개를 붙여 만든 사각형을 쭉 이어서 만들어줍니다.
버텍스와 인덱스를 통해 사각형 뿌리기를 포스팅하도록 하겠습니다.
툴에 최종적으로 만들어진 사각형 한 개 입니다.
삼각형 두 개로 이루어져있지요?
옆에 버튼 및 text는 도구상자에서 추가한 것이고 해당 버튼에 관한 속성으로 들어가면
원하는 이벤트(마우스 클릭, 활성화 등등)에 대한 함수를 설정할 수 있습니다.
여튼 아래와 같은 걸 만들겠습니다.
1. 먼저 맵클래스를 만들고 필요한 멤버변수를 다음과 같이 선언해주었습니다.
VertexBuffer : 정점을 만들어주는 c# directX에서 제공하는 클래스입니다.
IndexBuffer : 정점을 이어주는(그래서 더 효율적으로 그리게 해주는) 클래스입니다.
2. 버텍스(정점)를 생성해주고 셋팅해줍니다.
코드 및 더 자세하게 설명하자면
2_1. 먼저 버텍스 멤버변수인 m_vB를 생성해줍니다. 여기서 중요한 인자값은 2번째 인자값입니다. 이 인자값이 뜻하는 것은 정점의 갯수인데 지금 사각형이 1개일 때는 정점이 4개, 사각형이 2개일 때는 6개, 사각형이 3개 일 때는 8개가 필요합니다.
이런식으로 8개가 필요함. 공식은 (mXSize + 1) * (m_ZSize + 1)로 해주면 됩니다. (여기서 x는 가로, z는 세로라고 표현하는게 이해하기 쉬울듯?정확하게는 화면 안쪽으로 들어가는 z값, y는 높이) 공식을 간단히 설명하자면 처음 x와 z가 1이면 처음은 무조건 4개의 정점이 나오고 각 x와 z값에 1을 더해서 곱하면 2만큼 증가가 됩니다.
2_2. 버텍스를 4점을 선언해 위 코드와 같이 선언해줍니다.
|
3. 정점 vertex가 셋팅이 다 됐다면 인덱스를 셋팅해줍니다.
인덱스 배열은 Int16형으로 나타냈는데 0, 1, 2, 0, 2, 3이 무엇이냐 하면
기본 삼각형으로 사각형 1개를 그리려면 삼각형 2개를 붙여서 만들어야 되니까 정점이 6개 필요합니다.
근데 인덱스를 위와 같이 배열로 선언해두고 붙이면 정점을 4개만 선언해도 되고 효율적으로 그릴 수 있습니다.
물론 지금은 배열로 넣어놨지만 나중에는 변수로 두어 _indices에 값을 셋팅해주어야됩니다.
또 IndexBuffer를 생성할 때도 2번째 인자값이 중요합니다.
2번째 인자값 : (삼각형의 갯수) * (하나의 삼각형 정점수) * 16비트 혹은 32비트 사이즈(여기는 16비트이니 2로 함)
- 삼각형의 갯수는 2개
- 하나의 삼각형 정점수는 3개
- _indices배열의 자료형은 Int16입니다. Int16은 short와 같은 2바이트이므로 2를 곱해줍니다.
그래서 최종적으로 2 * 3 * 2 를 인자값에 써줍니다.
마찬가지로 락과 언락사이에 데이터를 써줍니다.
4. 디바이스 관련 셋팅을 아래와 같이 해줍니다.
5. Render함수는 Begin()과 End()사이에 두는 함수입니다.
RenderState셋팅과 Vertex과 Index를 아래와 같이 셋팅해주면 됩니다.
SetStreamSource는 정점을 물 흐르듯이 보내는 것을 셋팅해주븐 함수입니다.
여기서 DrawIndexedPrimitives함수에 대해 알아보겠습니다.
더 자세한 내용은 아래 페이지에 구글 번역본이 있습니다.
인자값 4, 6번째가 중요한데
4번째는 정점의 수 이고 6번째는 랜더링할 도형의 갯수 입니다.
사각형 1개 일 때, 정점의 수 : 4, 랜더링할 도형(삼각형) : 2
사각형 2개 일 때, 정점의 수 : 6, 랜더링할 도형(삼각형) : 4
사각형 3개 일 때, 정점의 수 : 8, 랜더링할 도형(삼각형) : 6
사각형 4개 일 때, 정점의 수 : 10, 랜더링할 도형(삼각형) : 8
사각형 5개 일 때, 정점의 수 : 12, 랜더링할 도형(삼각형) : 10
이런식으로 규칙적으로 늘어납니다. 이것을 통해 x와 z사이즈를 입력받아 맵을 생성할 수 있습니다.
'Programming > DirectX' 카테고리의 다른 글
[c#] directX 연동 및 툴 만들기 - 2 (1) | 2017.12.26 |
---|---|
[c#] directX 연동 및 툴 만들기 - 1 (3) | 2017.12.15 |
DirectX7 Blt함수 (0) | 2016.11.09 |
게임 벡터, 벡터 덧셈, 뺄셈, 크기, 단위 벡터 (0) | 2016.11.02 |
랜더링파이프라인의 정의 (0) | 2016.10.31 |