본문 바로가기
Programming/DirectX 3D

DrawPrimitive외 여러 Draw함수들

by 황금표정 2012. 2. 23.

D3D 드로잉 방법에는 여려가지가 있는데 매번 볼때마다 헷깔리는데 정리를 해보자.

1. DrawPrimitive

DrawPrimitive 는 버텍스 버퍼를 이용해 Draw할때 쓰임.

m_pD3DDevice->SetStreamSource( 0, pVB, 0, sizeof(CUSTOMVERTEX));
m_pD3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2);

2. DrawIndexedPrimitive

인덱스 버퍼의 장점은 정점을 여러번 나열하는 메모리 소모량을 줄일수 있고 정점 캐시에 저장해서 높은 효율을 낼수 있다.

예를 들어서 사각형은 삼각형이 2개가 필요하다. 이걸 버텍스 버퍼를 이용해 그리게 되면 정점을 6개 선언해야하지만

사실 정점은 4개만 선언하고 그릴수 있는 방법이 있다. 바로 인덱스 버퍼다.

삼각형을 이루는 정점을 인데스 리스트로 나열 하는 것이다.

INDEX[] = { {V0,V1,V2},{V0,V2,V3}}

이렇게 정점 정보를 4개만 선언하고 사각형을 그릴수가 있는것이다. 그럼으로써 메모리를 절약할수가 있다.

m_pD3DDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
m_pD3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pD3DDevice->SetIndices( g_pIB );
m_pD3DDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);

3 DrawPrimitiveUP

DrawPrimitive의 업그래이드 버전. DrawPrimitive는 CreateVertexBuffer로 버텍스 버퍼를 생성해야하는데

DrawPrimitiveUP는 버텍스 버퍼를 생성하지 않고 정점 정보만으로 도형을 그릴수가 있다.

MYVERTEX vtx[3] =
{
{ 0, 2, 0, 0xff0000ff },
{ 1, 0, 0, 0xffff0000 },
{-1, 0, 0, 0xff00ff00 },
};
m_pD3DDevice->SetFVF( MYVERTEX::FVF );
m_pD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 1, vtx, sizeof(MYVERTEX) );

하지만 내부적으로 동적 버퍼를 만들어서 그리는 방식이라고 함. 그래서 속도 저하가 있다는... 결론은 속도에 효율적이지 못하다.

3 DrawIndexedPrimitiveUP

DrawPrimitiveUP와 마찬가지로 베턱스 버퍼와 엔딕스 버퍼를 안만들고 그릴수 있는 함수다.

INDEX[] = { {V0,V1,V2},{V0,V2,V3}}

m_pD3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

m_pD3DDevice->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST, 0,4,2, INDEX, D3DFMT_INDEX16, vtx, sizeof(CUSTOMVERTEX) );

하지만 이함수 역시 속도에 효율적이지 못한 함수다. 간단한 테스트 용도로는 적합하다.


반응형