달력

12

« 2018/12 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  

'삼각형 띄우기'에 해당되는 글 1

  1. 2010.05.19 DirectX-정점(vertex_삼각형 띄우기)





먼저 정점을 띄우기 위해서는 정점을 보관할 정점 버퍼가 필요 합니다.

정점 버퍼에 FVF(사용자 정의 정점 형식)를 사용하여 생성할 수 있습니다.

최초 생성한 정점 버퍼는 쓰레기 값이 들어가 있기 때문에,

Lock함수를 사용하여 값을 넣을 수 있는 포인터를 가져 옵니다.

그 후 미리 지정해 놓은 정점 정보를 정점 버퍼에 저장합니다.


바로 그 일을 하는 함수가 InitVB입니다.

이제 정점 버퍼를 생성하고 값을 대입하였으니,

화면에 띄워 주는 일만 남았습니다.

화면에 띄워 주기 위해선 정점 버퍼를 출력 스트림에 할당하고,
셰이더 정보를 삽입한 후에,
화면에 출력시켜 주면됩니다.

이게 전반적인 흐름이고,
조금 자세히 한번 살펴 보도록 합시다.

CreateVertexBuffer 함수는 정점 버퍼를 생성하는 함수인데,
UINT Length,( 생성할 정점 버퍼의 바이트 단위 크기 )
DWORD Usage,( 정점 버퍼의 종류 혹은 처리 방식(SW, HW) 지정 )
DWORD FVF, ( 정점 정보 구조체에 따라 선언된 FVF 플래그 값 )
D3DPOOL Pool, ( 정점 버퍼가 저장될 메모리의 위치( 비디오카드, 시스템 메로리) 와 관련 방식 지정 )
IDirect3DVertexBuffer9** ppVertexBuffer, ( 반환될 정점 버퍼의 인터페이스 )
HANDLE* pSharedHandle
로 이루어져 있는데 HANDLE의 경우는 NULL을 넣어 주는것 같습니다.

다음으로 Lock 함수 같은 경우에는,
UINT OffsetToLock, ( Lock을 할 버퍼의 시작점, SizeToLock과 함께 양쪽 모두 0이면 버퍼 전체 )
UINT SizeToLock, ( Lock을 할 버퍼의 크기, OffsetToLock과 함께 양쪽 모두 0이면 버퍼 전체 )
void** ppbData, ( 읽고 쓸 수 있게 된 메모리 영역의 포인터 )
DWORD Flags ( Lock을 수행할 때 함께 사용하는 플래그 )
예제의 사용을 보면 버퍼의 시작점은 0으로 두고
사이즈는 sizeof를 사용해 할당 받고,
VOID* pVertices 라는 변수에 메모리 영역의 포인터를 삽입,
플래그는 주지 않은 상태인것을 확인 할 수 있습니다.

Lock함수의 주의점은 꼭 마지막에 UnLock를 해주어야 한다는 것을 잊지 맙시다.

다음으로 Render를 해줄때 사용하는
SetStreamSource, SetFVF, DrawPrimitive 함수를 살펴 봅시다.

책에선 SDK도움말을 확인 하라길래 그냥 인터넷에서 뒤져서 대충 정리해 보았습니다.

SetStreamSource 함수,
UINT StreamNumber, ( 스트림의 최대숫자까지 설정 할 수 있다는데, 보통 0으로 한다고 함 )
IDirect3DVertexBuffer9* pStreamData, ( 정점 버퍼가 저장된 데이타 )
UINT OffsetInBytes, (정점 버퍼에 시작될 스트림 오프셋 값, 보통 0을 지정한다.)
UINT Stride ( 한 정점의 크기로 앞서 설정된 구조체 크기를 넣어 준다.)

SetFVF 함수,
DWORD FVF ( 유연 정점 포맷, FVF의 설정 )

DrawPrimitive 함수,
D3DPRIMITIVETYPE PrimitiveType, ( 어떤 방식으로 그려줄 것인가에 대한 속성 값 )
UINT StartVertex, ( 로드하는 최초 정점 인덱스 )
UINT PrimitiveCount ( 랜더링 하는 도형의 갯수 )

대충 이정도 개념을 잡고 있으면 정점에 대해선 어느정도 이해한거라고 생각합니다.

// 전체 소스


// 실행 화면
Posted by 안식의후크