IDirect3DDevice9::CreateVertexBuffer
정점 버퍼를 생성한다.
Length - [in] 버퍼에 할당할 바이트 수, 8개의 정점을 보관하고 싶다면 8 * sizeof(struct vertex)로 크기를 조정한다.
정점버퍼의 크기, (ex) 한 정점에 들어가는 바이트 수가 들어 있는 변수 offset에 4를 곱하면 정점 4개에 필요한 메모리 크기가 된다.
Usage - [in] 버퍼가 이용되는 방법을 결정하는 특성을 지정
- D3DUSAGE_DYNAMIC - 동적 버퍼 설정
- D3DUSAGE_POINTS - 버퍼가 포인트 기본형으로 설정 (용책 14장 파티클 시스템), 정점 버퍼에서만 이용가능
- D3DUSAGE_SOFTWAREPROCESSING - 정점 프로세싱을 소프트웨어로 처리
- D3DUSAGE_WRITEONLY - 버퍼에 쓰기만을 수행할 것임을 설정, 드라이버가 쓰기 작업에 최적화된 메모리 위치로 버퍼를 이동, 이 버퍼를 읽으려 하면 오류 발생
FVF - [in] 정점 버퍼에 보관될 FVF
Pool - [in] 정점 버퍼가 저장될 메모리의 위치(그래픽 카드, 시스템 메모리)와 관리방식 지정
- D3DPOOL_MANAGED : D3D가 알아서 관리해주는 메모리 풀 사용하겠다
ppVertexBuffer - [out, return value] 반환된 정점 버퍼를 받을 포인터
pHandle - [in] 사용 안한다, 항상 NULL로 설정한다
생성된 정점 버퍼는 쓰레기 값으로 가득 차있다. 정점 버퍼에 값을 넣어주어야 하는데 정점 버퍼의 주소값이 필요하다.
이 때 Lock() 함수로 해당 메모리의 주소를 얻어야 한다.
주의 : 정점 버퍼의 해제는 D3D 디바이스 해제 이전에 이루어져야 한다. 정점 버퍼는 D3D 디바이스를 통해 생성되었기 때문이다
IDirect3DVertexBuffer9::Lock
정점 데이터의 범위를 잠그어, 정점 버퍼 메모리의 포인터를 얻어온다.
(쓰레드의 Lock()을 생각하면 된다. 다른 자원에선 접근이 불가능하다)
이후 획득한 메모리 포인터에 선언한 정점을 memcpy()로 복사한다.
다 끝난 이후엔 Unlock()으로 버퍼 잠금을 해제한다
gpgstudy.com/forum/viewtopic.php?t=5173
IDirect3DDevice9::CreateVertexBuffer
인덱스 버퍼를 생성한다
sizeof(short) * 6 : 인덱스 버퍼의 크기(바이트 수), 16비트 인덱스를 6개 사용하겠다
0 : 특별한 용도로 사용하는건 아니다
D3DFMT_INDEX16 : 각 색인은 16비트이다
D3DPOOL_MANAGED : D3D가 알아서 관리해주는 메모리 풀을 사용하겠다
gpFullscreenQuadIB : 새로 생성된 인덱스 버퍼를 저장할 포인터
NULL : 반드시 NULL이어야 한다
'그래픽스 > Dx 9' 카테고리의 다른 글
Direct X - 정점 선언 (0) | 2020.09.16 |
---|---|
Direct X 9 - 셰이더(Effect) (0) | 2020.09.16 |
Direct X 9 - 함수 (0) | 2020.09.15 |