챠니쓰 2008. 1. 26. 20:49

버텍스 버퍼 메모리에 접근하기 위해서는 일단 해당 메모리 영역을 잠궈야 한다.(Lock)
사용이 끝나면 반드시 닫아 주어야 한다.(unLock)

HRESULT Lock(
 UINT   OffsetToLock,  
 UINT   SizeToLock,  
 VOID **   ppbData,  
 DWORD   Flags    );

OffsetToLock : 잠금을 시작할 버퍼 위치의 오프셋

SizeToLock : 잠글 바이트의 수

ppbData : 잠근 메모리의 시작을 가리키는 포인터(해당 포인터로 시작지점을 가져온다)

Flags : 잠금을 이루는 방법, 보통 0을 사용하나 다음과 같은 플래그들이 있다.

   - D3DLOCK_DISCARD
: 동적 버퍼에만 이용할 수 있다.
: 하드웨어에게 버퍼를 버리도록 지시하고 새로 할당된 버퍼의 포인터를 리턴한다.
: 새로 할당된 버퍼에 접근하면서도 버려진 버퍼에서 렌더링을 수행할 수 있도록 해준다.
: 하드웨어 지연을 막는데 도움이 되는 플래그

   - D3DLOCK_NOOVERWRITE
: 동적 버퍼에만 이용할 수 있다.
: 버퍼에 데이터를 추가하는 작업만 가능하도록 한다.
: 현재 렌더링 중인 메모리를 덮어 쓸 수 없게 된다.
: 새 데이터를 추가하는 동안에도 렌더링을 계속할 수 있도록 해 준다.

  - D3DLOCK_READONLY
: 읽기 전용.
: 내부적인 최적화를 가능하게 해준다.


아래와 같은 예로 사용된다.

if (FAILED(g_pVB->Lock(0, sizeof(vertices),(void**)&pVertices,0)))
  return E_FAIL;
 memcpy(pVertices, vertices, sizeof(vertices));
 g_pVB->Unlock();